perm filename GOMOVE.FAI[GO,ALS] blob
sn#106804 filedate 1974-06-12 generic text, type T, neo UTF8
00100 TITLE GOMOVE 5/15/70
00150 ; LAST EDITED BY GJA 7/2/72
00200
00300 EXTERN INFLTB,BOARDS,GBOARD,GB1,GB2,BLKARM,WHTARM,KOTAC,TTYGUY
00400 EXTERN NDXFOR,GRPPTR,MSCVAL,WHDATA,BLDATA,IIIDPY,PNTDPY
00500 EXTERN PFORCE,IFORCE,JFORCE,IFOR,JFOR,KFOR,BRDDPY,ZARMY
00600 EXTERN KILSAV,KLLR,SAVR,STRSET,LIBEST,LIBVEC,NGHSTR,HDCPNT
00700 INTERN LEGAL,XSTRPT,XSTKSR,XGB3,UNMOVE,STRPTR
00800 INTERN DRIVER,GDRIVE,CONNDO,GB3,ENDANG,IIISET,KILLIV,LADRST
00900 INTERN NOMOVE,UNTAC1,LEGAL1,LEGAL2,UNMOV1,TACEVL,LINE4,DRIVR1
01000 INTERN EYDIAG,G1DIAG,EYENUM,NODANS,G1IKKN,TACSV1,EYCHEK
01100 INTERN GB1TST,GODOWN,PIKPIL,GRUPNO,ELTNOS,GBDTST,TACSAV,ADLEND
01200 INTERN AREA,AREAPT,XAREAP,KWAREA
01250 EXTERN PUTBWB
01260
01265
01270 OPDEF ERRUUO [5B8]
01275 DEFINE SAILERR & (NMBR,MESSAGE) <
01280 ERRUUO 1,[ASCIZ /GOMOVE ERROR NUMBER &NMBR& &MESSAGE/]>
01285
01290
01295
01300
01400 ;*****SYMBOLIC REGISTERS USED OR AVAILABLE
01500 ↓TAC←1
01600 ↓TAC1←2
01700 ↓TAC2←3
01800 ↓TAC3←4
01900 ↓TAC4←5
02000 ↓TAC5←6
02100 ↓FRIEND←7
02200 ↓ENEMY←10
02300 ↓STKREG←10
02400 ↓BLANK←11
02500 ↓BWREG←12
02600 ↓SEARCH←13
02700 ↓REPLCE←14
02800 ↓CLEAR←15
02900 ↓PDP←17
03000
03100 ;*****CONSTANT SYMBOLS OF LARGE IMPORT
03200 ↓MXARNO←=50 ;MAX NUMBER OF ARMIES (OR WALLS)
03300 BRDWTH←=21 ;BOARD WIDTH, INCLUDING EDGES
03400 STRMAX←=127 ;MAX NUMBER OF STRINGS
03500 STKMAX←=450 ;SIZE OF STRING STACK FOR LOOKAHEAD
03600 WHTOCC←400000 ;WHITE POINT OCCUPANCY
03700 WHTSHF←-=17 ;SHIFTS WHTOCC TO RIGHT END OF WORD
03800 BLKOCC←200000 ;BLACK POINT OCCUPANCY
03900 BNKOCC←100000 ;BLANK POINT OCCUPANCY
04000 NONOCC←40000 ;OFF-EDGE POINT
04100 STRCNT←1 ;STRING COUNTER
04200 STRBTS←177 ;MAXIMUM ALLOWABLE # OF STRINGS
04300 GRPCNT←200 ;GROUP COUNTER
04400 GRPBTS←177 ;MAXIMUM ALLOWABLE # OF GROUPS
04500 WHTNGH←1 ;WHITE NEIGHBOR COUNTER
04600 BLKNGH←20 ;BLACK NEIGHBOR COUNTER
04700 NGHBTS←17 ;MAXIMUM ALLOWABLE # OF NEIGHBORS
04800 OCCBIT←10 ;POINT OCCUPIED NEIGHBOR BIT
04900 AWSRRH←1 ;STRING LIBERTY COUNTER
05000 AWSRRM←777 ;MAXIMUM ALLOWABLE # OF STR LIBS
05100 AWSLRH←1000 ;STRING STONE COUNTER
05200 AWSLRM←777 ;MAX ALLOWABLE # OF STONES
05300 BCON←100000 ;CONNECTED TO BLACK
05400 WCON←200000 ;CONNECTED TO WHITE
05500 HBCON←40000 ;HALF-CONNECTED TO BLACK
05600 HWCON←20000 ;HALF-CONNECTED TO WHITE
05700 LRHSHF←-11 ;FOR SHIFTING LRH TO RRH
05800 EYE←4000 ;EYE MARK IN GBOARD
05900 DAME←2000 ;DAME MARK IN GBOARD
06000 EYEVAL←3 ;# HALFEYES AWARDED FOR A SURE EYE
06100 BKOUT←10000 ;BEEN THERE BIT FOR RECURSIVE SEARCHES
06200 KEYBIT←4000 ;"KEY" FLAG IN STRING DATA
06300 DEDBIT←2000 ;"DEAD" FLAG IN STRING DATA
06400 DANBIT←1000 ;"ENDANGERED" FLAG IN STRING DATA
06500 TACBIT←400000 ;GBOARD "BAD AREA POINT" MARKER
06600
06700 ;**********
06800 ; GB3 HOLDS BITS REPRESENTING TACTICAL PROPERTIES OF THE POINT
06900 ;IN QUESTION. THE BITS 0-17 HOLD DATA WRT "ENEMY", WHILE BITS 18-35
07000 ;HOLD DATA WRT "FRIENDLY". NOTE THAT BOTH PARTS OF THE WORD CAN BE
07100 ;USEFUL TO EITHER PLAYER'S EVALUATION.
07200 ENMGRD←1 ;ON ENEMY GROUND
07300 ATARES←2 ;ATARI ENEMY STONE(S)
07400 TWOLES←4 ;TWOLIBERTY ENEMY STONE(S)
07500 SAVFRS←10 ;SAVE FRIENDLY STONE(S)
07600 SECCON←20 ;"SECURE" CONNECTION TO FRIENDLY GROUP
07700 NDNGST←40 ;ENDANGER THE STONE JUST PLAYED
07800 TWOLFS←100 ;TWOLIBERTY FRIENDLY STONE(S)
07900 ENMGRP←200 ;ON ENEMY GROUP POINT
08000 EXPFGP←400 ;EXPANDS FRIENDLY GROUP(S)
08100 FRDTIG←1000 ;MAKES USEFUL TIGERMOUTH FOR FRIENDLY
08200 FRDEYE←2000 ;MAKES AN EYE FOR FRIENDLY
08300 ENBLOK←4000 ;BLOCKS ENEMY EXPANSION MOVE
08400 SPLENG←10000 ;SPLITS AN ENEMY GROUP
08500 CMFRDG←20000 ;COMBINES FRIENDLY GROUPS
08600 ENAREA←40000 ;ON ENEMY AREA POINT
08700 EXPFRA←100000 ;MAKES MORE FRIENDLY AREA
08800 GPNDNG←200000 ;"NEAR ENDANGERED GROUP" MARKER
08900 BADHAF←400000 ;MAKES WORST SORT OF FRIENDLY HALFCON
09000 ;**********
09100
09200 XGB3: GB3 ;ALSO POINTER FOR SAIL
09300 0
09400 BRDWTH*BRDWTH-1
09500 1
09600 XWD 1,BRDWTH*BRDWTH
09700 GB3: BLOCK BRDWTH*BRDWTH
09800
09900 ;*****TEMP STORAGE
10000 CAPTST: BLOCK 5
10100 STRNUM: BLOCK 5
10200 PIKPIL: BLOCK 5
10300 GRUPNO: BLOCK 5
10400 0 ;HOLDS POTENTIAL DIAG MOVES COUNT
10500 EYENUM: BLOCK 4
10600 WBSAV: 0
10700 TACSAV: 0
10800 TACSV1: 0
10900 NSTRNG: 0
11000 TACCPT: 0
11100 T5SAV: 0
11200 FORCMV: 0
11300 CHRACT: 0
11400 NFRND: 0
11500 NENEMY: 0
11600 NBLANK: 0
11700 NBLNKS: 0 ;COUNTS # BLANK NGH IN NOMOVE
11800 R16SAV: 0
11900 PDPSAV: 0
12000 NODANS: 0
12100 DFLAG: 0 ;HOLDS BEST "HOPELESS" GROUP SCORE
12200
12300 ;*****NEIGHBOR ADJUSTING ADD AND SUBTRACT
12400 BLKWHT: WHTNGH ;WHT NEIGHBOR MARK
12500 BLKNGH ;BLK NEIGHBOR MARK
12600 -BLKNGH ;BLK NEIGH SUB
12700 -WHTNGH ;WHT NEIGH SUB
12800 FRNDON: NGHBTS*WHTNGH ;WHITE NEIGHBOR COUNT BITS
12900 NGHBTS*BLKNGH ;BLACK NEIGHBOR COUNT BITS
13000 NGHBTS*WHTNGH
13100
13200 ;*****FRIEND-ENEMY DISCRIMINATION
13300 FRND: XWD WHTOCC,BLKOCC
13400 XWD BLKOCC,WHTOCC
13500 WBHCON: XWD WCON,HWCON
13600 XWD BCON,HBCON
13700
13800 ;**********
13900 ; STRING DESCRIPTION STORAGE. THE "FIRST" JOB OF THE LEGAL
14000 ;MOVE PROCESSOR IS TO MAKE A NEW OR AUGMENTED STRING CONTAINING THE
14100 ;LATEST MOVE. ALL ACTIVE STRINGS ARE IN STRPTR, SOME "OLDER" STRINGS
14200 ;ARE SAVED IN STSTAK DURING LOOKAHEAD. NOTE FOLLOWING CONVENTIONS:
14300 ;1. STRING #=0 MEANS NO STRING BECAUSE POINT IS BLANK
14400 ;2. STRING # =177 (OCTAL) MEANS POINT OFF EDGE (NEEDED FOR REPLACING)
14500 ;**********
14600
14700 ;*****CURRENT STRING STORAGE
14800 XSTRPT: STRPTR ;ALSO POINTER FOR SAIL
14900 0
15000 2*STRMAX+1
15100 1
15200 XWD 1,2*(STRMAX+1)
15300 STRPTR: 1
15400 BLOCK 2*STRMAX+1
15500
15600 ;*****RECORD OF OLD STRINGS FROM ONE OR MORE MOVES AGO
15700 XSTKSR: STKSRT ;POINTER FOR SAIL
15800 STSTAK
15900 -2
16000 STKMAX-1
16100 1
16200 XWD 1,STKMAX+2
16300 STKSRT: IOWD STKMAX,STSTAK
16400 STKPTR: IOWD STKMAX,STSTAK
16500 STSTAK: BLOCK STKMAX
16600
16700 ;*****INDEX ADJUSTMENT FOR GETTING AROUND THE BOARD
16800 GODOWN: XWD TAC,-BRDWTH
16900 XWD TAC,-1
17000 BACKUP: XWD TAC,BRDWTH
17100 XWD TAC,1
17200 XWD TAC,-BRDWTH
17300 XWD TAC,-1
17400 XWD TAC,BRDWTH ;EXTRAS NEEDED IN LADDER CHECKING
17500 XWD TAC,1
17600 XWD TAC,-BRDWTH
17700
17800 ;*****INDIRECT ADDR FOR GBORD1
17900 XWD TAC,GB1
18000 GB1TST: XWD TAC,GB1-BRDWTH
18100 XWD TAC,GB1-1
18200 XWD TAC,GB1+BRDWTH
18300 XWD TAC,GB1+1
18400 XWD TAC,GB1-BRDWTH
18500 XWD TAC,GB1-1
18600 XWD TAC,GB1+BRDWTH
18700
18800 ;*****INDIRECT ADDRESS FOR GBOARD
18900 XWD TAC,GBOARD
19000 GBDTST: XWD TAC,GBOARD-BRDWTH
19100 XWD TAC,GBOARD-1
19200 XWD TAC,GBOARD+BRDWTH
19300 XWD TAC,GBOARD+1
19400 XWD TAC,GBOARD-BRDWTH
19500 XWD TAC,GBOARD-1
19600 XWD TAC,GBOARD+BRDWTH
19700
19800 ;*****GBOARD DIAGONAL OFFSETS
19900 GBDIAG: XWD TAC,GBOARD-BRDWTH+1
20000 XWD TAC,GBOARD-BRDWTH-1
20100 XWD TAC,GBOARD+BRDWTH-1
20200 XWD TAC,GBOARD+BRDWTH+1
20300 XWD TAC,GBOARD-BRDWTH+1
20400
20500 ;*****GB1 SINGLE SKIPS
20600 G1IKKN: XWD TAC,GB1-2*BRDWTH
20700 XWD TAC,GB1-2
20800 XWD TAC,GB1+2*BRDWTH
20900 XWD TAC,GB1+2
21000 XWD TAC,GB1-2*BRDWTH
21100 XWD TAC,GB1-2
21200
21300 ;*****GB1 DIAGONAL OFFSETS
21400 G1DIAG: XWD TAC,GB1-BRDWTH+1
21500 XWD TAC,GB1-BRDWTH-1
21600 XWD TAC,GB1+BRDWTH-1
21700 XWD TAC,GB1+BRDWTH+1
21800 XWD TAC,GB1-BRDWTH+1
21900 XWD TAC,GB1-BRDWTH-1
22000 XWD TAC,GB1+BRDWTH-1
22100
22200 ;*****INDIRECT ADDR FOR GB3
22300 GB3TST: XWD TAC,GB3-BRDWTH
22400 XWD TAC,GB3-1
22500 XWD TAC,GB3+BRDWTH
22600 XWD TAC,GB3+1
22700
22800 ;*****GBOARD SINGLE SKIPS
22900 GBIKKN: XWD TAC,GBOARD-2*BRDWTH
23000 XWD TAC,GBOARD-2
23100 XWD TAC,GBOARD+2*BRDWTH
23200 XWD TAC,GBOARD+2
00100 ;**********
00200 ; THIS DRIVING SECTION WILL HANDLE ALL PRESENTLY CONTEMPLATED
00300 ;RECURSIVE SEARCHES. NOTE THAT ONLY GB1 CAN BE SEARCHED BY DRIVER.
00400 ;TAC, SEARCH, CLEAR, AND REPLCE MUST BE SET EXTERNALLY. POSSIBLE SEARCHES:
00500 ;1. BY ARMY NUMBER (BITS 6-11 OF GB1)
00600 ;2. BY WALL NUMBER (BITS 12-17 OF GB1)
00700 ;3. BY POINT OCCUPATION STATUS (BITS 19-22 OF GB1)
00800 ;4. BY GROUP NUMBER (BITS 23-28 OF GB1)
00900 ;5. BY STRING NUMBER (BITS 29-35 OF GB1)
01000 ;**********
01100 STRMAK: MOVEM CLEAR,ADLROU-1 ;MAX POSSIBLE NUMBER OF LIBS TO FIND
01200 MOVEI CLEAR,STRBTS*STRCNT
01300 SKIPA TAC1,[PUSHJ PDP,ADLROU] ;SET DRIVER FOR STRING AMALGAMATION
01400 DRIVER: MOVE TAC1,[PUSHJ PDP,ADLEND+1];SET DRIVER FOR SIMPLE REPLACEMENT
01500 MOVEM TAC1,DRIVR1-3
01600 JRST 0(TAC1)
01700 MOVEI TAC1,3
01800 MOVE TAC2,@GB1TST(TAC1) ;START LOOKING AT NEIGHBOR
01900 XOR TAC2,SEARCH
02000 TDNE TAC2,CLEAR ;SKIP MEANS A MATCH
02100 JRST DRIVR1
02200 MOVEI TAC,@GODOWN(TAC1)
02300 HRLM TAC1,0(PDP)
02400 0 ;RECURSIVE SEARCH STARTS HERE
02500 HLRZ TAC1,0(PDP)
02600 MOVEI TAC,@BACKUP(TAC1)
02700 DRIVR1: SOJGE TAC1,DRIVER+4
02800 POPJ PDP,
02900
03000 ;**********
03100 ; GDRIVE IS ESSENTIALLY THE SAME AS DRIVER, EXCEPT THAT IT ALLOWS
03200 ;THE STATE OF HALF-CONNECTEDNESS. THIS MEANS TWO ENTITIES ARE CONSIDERED
03300 ;CONNECTED WHEN THERE IS AT MOST ONE INTERVENING POINT NOT IN EITHER OF
03400 ;THE TWO ENTITIES. AT PRESENT, GROUPS ARE THE ONLY POSSIBLE "ENTITIES".
03500 ;**********
03600 GDRIVE: ANDCAM CLEAR,GB1(TAC)
03700 ORM REPLCE,GB1(TAC)
03800 MOVEI TAC1,3
03900 MOVE TAC2,@GB1TST(TAC1)
04000 AND TAC2,CLEAR
04100 CAME TAC2,SEARCH
04200 JRST GDRIV2
04300 MOVEI TAC,@GODOWN(TAC1)
04400 HRLM TAC1,0(PDP)
04500 PUSHJ PDP,GDRIVE
04600 HLRZ TAC1,0(PDP)
04700 MOVEI TAC,@BACKUP(TAC1)
04800 GDRIV1: SOJGE TAC1,GDRIVE+3
04900 POPJ PDP,
05000 GDRIV2: CAME TAC2,CLEAR
05100 JRST GDRIV1
05200 MOVEI TAC,@GODOWN(TAC1)
05300 HRLM TAC1,0(PDP)
05400 PUSHJ PDP,CONNDO
05500 JRST GDRIV1-2
05600 ;*****TO STEP OVER ONE INTERVENING HALFCON
05700 CONNDO: MOVEI TAC1,3
05800 MOVE TAC2,@GB1TST(TAC1)
05900 AND TAC2,CLEAR
06000 CAME TAC2,SEARCH
06100 JRST CNNDO1
06200 MOVEI TAC,@GODOWN(TAC1)
06300 HRLM TAC1,0(PDP)
06400 PUSHJ PDP,GDRIVE
06500 HLRZ TAC1,0(PDP)
06600 MOVEI TAC,@BACKUP(TAC1)
06700 CNNDO1: SOJGE TAC1,CONNDO+1
06800 POPJ PDP,
06900
07000 ;**********
07100 ; THIS IS A SETUP ROUTINE FOR DRIVER WHEN STONES ARE CAPTURED
07200 ;OR REPLACED DURING A MOVE/UNMOVE. NOTE THAT TAC, CLEAR, AND SEARCH
07300 ;(OR REPLCE) MUST BE SET BEFORE THE SETUP ROUTINE!
07400 ;**********
07500 PICKUP: SETZ REPLCE,
07600 MOVE TAC3,[AOS STRPTR(TAC2)]
07700 MOVE TAC4,[PUSHJ PDP,NEIIN2+1]
07800 JRST PIKPUT
07900 PUTDON: SETZ SEARCH,
08000 MOVE TAC3,[SOS STRPTR(TAC2)]
08100 MOVE TAC4,[PUSHJ PDP,NEIIN0+1]
08200 PIKPUT: TLNN TAC1,DEDBIT ;TAC1 MUST HOLD STRING DATA
08300 JRST PIKPU1 ;NOT DEAD REMOVAL SITUATION
08400 SETOM NEIADJ-1 ;SET FOR DEADNESS
08500 TRNE TAC1,776000
08600 JRST PIKPU1 ;MORE THAN ONE DEAD MAN
08700 MOVE TAC2,GBOARD(TAC)
08800 CAIE ENEMY,BLKOCC
08900 TRCA TAC2,7*WHTNGH
09000 TRC TAC2,7*BLKNGH
09100 MOVEM TAC2,GBOARD(TAC) ;RESTORE SPECIAL NGHBOR BITS
09200 PIKPU1: MOVEM TAC4,LBLOP2
09300 MOVEI CLEAR,STRBTS*STRCNT
09400 MOVE TAC2,[PUSHJ PDP,PIKROU]
09500 MOVEM TAC2,DRIVR1-3 ;SPECIAL HEAD FOR DRIVER
09600 MOVEM TAC3,LBLOP1-1
09700 PUSHJ PDP,PIKROU
09800 SETZM NEIADJ-1 ;SET FLAG NORMAL
09900 POPJ PDP,
10000
10100 ;**********
10200 ; PIKROU PROCESSES THE "ENDS" OF THE AREA SEARCHED BY DRIVER
10300 ;IN THE CASE WHERE WE WANT TO PICK UP OR REPLACE STRINGS. IT FIXES
10400 ;THE BOARD POSITION, THE INFLUENCE, AND THE STRING NAME.
10500 ;**********
10600
10700 PIKROU: SETZM PIKPIL
10800 MOVEI TAC3,3
10900 LIBLOP: TDNN FRIEND,@GB1TST(TAC3)
11000 JRST LBLOP1 ;NOT ADJACENT FRIENDLY
11100 MOVE TAC2,@GB1TST(TAC3)
11200 ANDI TAC2,STRBTS*STRCNT
11300 MOVEI TAC4,PIKPIL
11400 SKIPN 0(TAC4)
11500 JRST .+4
11600 CAME TAC2,0(TAC4)
11700 AOJA TAC4,.-3
11800 JRST LBLOP1 ;DUPLICATION
11900 MOVEM TAC2,0(TAC4)
12000 SETZM 1(TAC4)
12100 0 ;SET BY PICKUP OR PUTDON
12200 LBLOP1: SOJGE TAC3,LIBLOP
12300 XORM ENEMY,GB1(TAC)
12400 XORM BLANK,GB1(TAC)
12500 SKIPGE TAC5,FORCMV
12600 LBLOP2: 0 ;SET BY PICKUP OR PUTDON
12700 SKIPN IIIDPY
12710 JRST ADLEND+1
12720 PUSH PDP,TAC
12730 PUSH PDP,CHRACT
12800 PUSHJ PDP,PUTBWB
12900 JRST ADLEND+1
13000
13100 ;**********
13200 ; THIS ENDING OF PIKROU IS USED WHEN TACCLC WANTS TO FIND OUT HOW
13300 ;CAPTURES HAVE AFFECTED THE ADJACENT FRIENDLY STRINGS.
13400 ;**********
13500
13600 LIBCHK: AOS STRPTR(TAC2)
13700 MOVE TAC1,STRPTR(TAC2)
13800 ANDI TAC1,AWSRRM*AWSRRH
13900 CAIGE TAC1,3
14000 TRO 16,SAVFRS ;FRIEND SAVED
14100 SKIPGE WBSAV
14200 JRST LBLOP1 ;WE ALREADY KNOW ABOUT COMBINING
14300 MOVE TAC1,@GB1TST(TAC3)
14400 ANDI TAC1,GRPBTS*GRPCNT
14500 SKIPN WBSAV
14600 MOVEM TAC1,WBSAV ;DEFINE WBSAV AS FIRST GROUP SEEN
14700 CAMN TAC1,WBSAV
14800 JRST LBLOP1 ;HAVENT SEEN TWO GROUPS YET
14900 TRO 16,CMFRDG ;CONNECTS AT LEAST TWO FRIENDLIES
15000 MOVNM TAC1,WBSAV ;DONT LOOK FOR COMBINING ANY MORE
15100 JRST LBLOP1
15200
15300 ;**********
15400 ; THIS IS THE ROUTINE WHICH PROCESSES STRING ENDS WHEN AN
15500 ;INFALLIBLE STRING EVALUATION IS DESIRED (USUALLY ONLY AT THE END OF
15600 ;A PLY). IT HANDLES ALL CASES OF DUPLICATED LIBS, ETC.
15700 ;**********
15800 0 ;HOLDS POSSIBLE # LIBERTIES TO FIND
15900 ADLROU: MOVEI TAC2,3
16000 TDNN BLANK,@GB1TST(TAC2)
16100 JRST ADLEND ;NOT A POSSIBLE LIBERTY
16200 MOVEI TAC,@GODOWN(TAC2)
16300 MOVEI TAC1,3
16400 CHKLOP: MOVEI TAC3,STRBTS*STRCNT
16500 AND TAC3,@GB1TST(TAC1)
16600 CAME TAC3,REPLCE ;IF TRUE, THEN LIB ALREADY COUNTED
16700 SOJGE TAC1,CHKLOP
16800 MOVEI TAC,@BACKUP(TAC2)
16900 JUMPGE TAC1,ADLEND
17000 AOS STRPTR(REPLCE)
17100 SOSLE ADLROU-1 ;FOUND ONE OF THE POSSIBLE LIBS
17200 JRST ADLEND
17300 MOVEI TAC3,ADLEND+1 ;NO MORE LIBS CAN BE FOUND,
17400 HRRM TAC3,DRIVR1-3 ;SO DONT LOOK FOR ANY
17500 ADLEND: SOJGE TAC2,ADLROU+1
17600 ANDCAM CLEAR,GB1(TAC)
17700 ORM REPLCE,GB1(TAC)
17800 JRST DRIVER+3
17900
18000 ;**********DEFINE IIIDPY THROUGH STATUS OF THE CURRENT TTY
18100 IIISET: SETO 1,
18200 GETLIN 1
18300 POPJ PDP,
18400
21600 ;**********
21700 ; FIND ALL GROUPS NEXT TO THE STRING NAMED IN SEARCH. THESE GROUP
21800 ;NAMES WILL BE PUT IN WHTARM.
21900 ;**********
22000 CONNCT: PUSHJ PDP,STRSET+1
22100 MOVE FRIEND,GB1(TAC)
22200 ANDI FRIEND,BLKOCC+WHTOCC
22300 XORI FRIEND,BLKOCC+WHTOCC ;FRIEND CONTAINS ATTACKING STONE
22400 MOVE TAC1,[PUSHJ PDP,CNNCT1]
22500 MOVEM TAC1,DRIVR1-3
22600 SETZM WHTARM
22700 SETZM WHTARM+1 ;MAKES EASY TEST FOR KEYNESS
22800 CNNCT1: MOVEI TAC2,3
22900 LDB TAC1,[POINT 8,@GB1TST(TAC2),28]
23000 CAIGE TAC1,177
23100 JUMPN TAC1,CNNCT3
23200 CAILE TAC1,177
23300 JRST CNNCT2 ;OFF EDGE POINT
23400 MOVEI TAC,@GODOWN(TAC2)
23500 MOVEI TAC5,3
23600 CNNCT5: LDB TAC1,[POINT 8,@GB1TST(TAC5),28]
23700 JUMPE TAC1,CNNCT4
23800 CAIL TAC1,177
23900 JRST CNNCT4
24000 HRRZ TAC3,GRPPTR+MXARNO(TAC1)
24100 TDNE FRIEND,GB1(TAC3)
24200 PUSHJ PDP,GPPNT1
24300 CNNCT4: SOJGE TAC5,CNNCT5
24400 MOVEI TAC,@GODOWN+2(TAC2)
24500 JRST CNNCT2
24600 CNNCT3: HRRZ TAC3,GRPPTR+MXARNO(TAC1)
24700 TDNE FRIEND,GB1(TAC3)
24800 PUSHJ PDP,GPPNT1
24900 CNNCT2: SOJGE TAC2,CNNCT1+1
25000 JRST ADLEND+1
25100
25200 ;**********
25300 ; THIS ROUTINE IS CRUCIAL TO MANAGEMENT OF DEAD STRINGS AND HENCE OF
25400 ;GROUP CONNECTION. (WE CONSIDER A DEAD STONE TO BE HALF-CONNECTED FOR THE
25500 ;KILLING SIDE.) THE HALF-CONNECTEDNESS IS SET AND UNSET BY LADRST.
25600 ;**********
25700 LADRST: MOVE TAC,PFORCE
25800 LDB SEARCH,[POINT 7,GB1(TAC),35]
25900 MOVE TAC1,STRPTR(SEARCH)
26000 MOVE TAC5,GBOARD(TAC)
26100 TLNN TAC1,DEDBIT
26200 JRST LADR01
26300 ;*****NEWLY DEAD STRING?
26400 TRNN TAC5,BCON
26500 JRST WHTDED
26600 TRZ TAC5,BCON+OCCBIT*BLKNGH
26700 TRCE TAC5,7*BLKNGH
26800 JRST LADR03
26900 JRST LADONE ;ONLY ONE STONE
27000 WHTDED: TRNN TAC5,WCON
27100 POPJ PDP, ;STRING WAS ALREADY SET DEAD
27200 TRZ TAC5,WCON+OCCBIT*WHTNGH
27300 TRCN TAC5,7*WHTNGH
27400 JRST LADONE ;ONLY ONE STONE
27500 SKIPA TAC5,[TRZ TAC3,OCCBIT*WHTNGH]
27600 LADR03: MOVE TAC5,[TRZ TAC3,OCCBIT*BLKNGH]
27700 JRST LADR02+1
27800 ;*****NEWLY UNDEAD STRING?
27900 LADR01: TRNE TAC5,BCON+WCON
28000 POPJ PDP, ;STRING ALREADY IS SET UNDEAD
28100 MOVE TAC4,GB1(TAC)
28200 TRNN TAC4,BLKOCC
28300 JRST UNWDED
28400 TRO TAC5,BCON+OCCBIT*BLKNGH
28500 TRC TAC5,7*BLKNGH
28600 TRNE TAC5,7*BLKNGH
28700 JRST LADR02
28800 TRZA TAC5,HBCON+HWCON
28900 LADONE: TRO TAC5,HBCON+HWCON
29000 MOVEM TAC5,GBOARD(TAC)
29100 POPJ PDP,
29200 UNWDED: TRO TAC5,WCON+OCCBIT*WHTNGH
29300 TRC TAC5,7*WHTNGH
29400 TRNN TAC5,7*WHTNGH
29500 JRST LADONE-1
29600 SKIPA TAC5,[TRO TAC3,OCCBIT*WHTNGH]
29700 LADR02: MOVE TAC5,[TRO TAC3,OCCBIT*BLKNGH]
29800 MOVEM TAC5,LADRS1+1
29900 SETZ TAC5,
30000 PUSHJ PDP,STRSET
30100 MOVE TAC1,[PUSHJ PDP,LADRS1]
30200 MOVEM TAC1,DRIVR1-3
30300 LADRS1: HRRZ TAC3,GBOARD(TAC)
30400 0 ;SET BY LADRST PREPROCESSING
30500 SETZ TAC4,
30600 PUSHJ PDP,NEIADJ+2
30700 JRST ADLEND+1
00100 ;**********REMOVE INFLUENCE,NEIGHBORS DURING UNMOVE
00200 NEIIN2: MOVE TAC,TACSAV
00300 CAME TAC5,[-2] ;DONT DO INFLUENCE DURING LADDERS
00400 PUSHJ PDP,INFLSB(BWREG)
00500 MOVE TAC5,BLKWHT+2(BWREG)
00600 JRST NEIADJ
00700 ;**********PUT DOWN INFLUENCE,NEIGHBORS
00800 NEIIN0: MOVE TAC,TACSAV
00900 CAME TAC5,[-2] ;DONT DO INFLUENCE DURING LADDERS
01000 PUSHJ PDP,INFLSB(BWREG)
01100 MOVE TAC5,BLKWHT(BWREG)
01200 JRST NEIADJ
01300
01400 ;**********
01500 ; ADJUST THE NEIGHBOR MARKS AND CARRY OUT THE CALCULATION FOR
01600 ;CONNECTEDNESS. THE MOVE POINT'S NEIGHBORS ALL GET TAC5 ADDED, WHILE THE
01700 ;POINT ITSELF GETS OCCBIT*TAC5. THE BCON, WCON, WBCON, HWCON BITS ARE SET.
01800 ;**********
01900 0 ;FLAG FOR SPECIAL DEAD STONE HANDLING
02000 NEIADJ: MOVEI TAC4,4
02100 HRRZ TAC3,@GBDTST-1(TAC4) ;RIGHT HALF OF GBOARD
02200 TRZ TAC3,BCON+WCON+HBCON+HWCON
02300 ADD TAC3,TAC5 ;ADJUST NEIGHBOR COUNT
02400 TRNN TAC3,NGHBTS*BLKNGH ;ANY BLACK NEIGHBORS
02500 JRST WHTCHK
02600 TRNN TAC3,NGHBTS*WHTNGH ;ANY WHITE NEIGHBORS
02700 JRST BLKCON
02800 TRNE TAC3,OCCBIT*BLKNGH ;IS BLACK STONE HERE
02900 JRST BLKCON
03000 TRNE TAC3,OCCBIT*WHTNGH ;IS WHITE STONE HERE
03100 JRST WHTCON
03200 TRNE TAC3,BLKNGH*2 ;BLACK HALF-CONNECTION
03300 ADDI TAC3,HBCON
03400 TRNE TAC3,WHTNGH*2 ;WHITE HALF-CONNECTION
03500 ADDI TAC3,HWCON
03600 JRST ENDNGH
03700 WHTCHK: TRNN TAC3,NGHBTS*WHTNGH ;ANY WHITE NEIGHBORS
03800 JRST ENDNGH
03900 WHTCON: TROA TAC3,WCON
04000 BLKCON: TRO TAC3,BCON
04100 ENDNGH: HRRM TAC3,@GBDTST-1(TAC4)
04200 SOJG TAC4,NEIADJ+1
04300 JUMPE TAC4,.+2
04400 POPJ PDP,
04500 SKIPE NEIADJ-1
04600 TDZA TAC5,TAC5
04700 ASH TAC5,3
04800 JRST NEIADJ+1
04900
05000 ;*****OFFSETS FOR SETTING UP INFLUENCE ADJUSTMENT
05100 INFADJ: XWD TAC5,=14
05200 XWD TAC5,=7
05300 GBDADJ: XWD TAC5,2*BRDWTH
05400 XWD TAC5,BRDWTH
05500 XWD TAC5,0
05600 JSTART: 2
05700 1
05800 ELTNOS: 4
05900 5
06000 REPEAT BRDWTH-6,{ 6}
06100 5
06200 4
06300
06400 ;**********
06500 ; INFLSB WILL SUBTRACT INFLUENCE ABOUT THE MOVE POINT (AT TAC). THE
06600 ;ENTRY INFLSB+1 WILL ADD INFLUENCE. NOTE THAT CARE IS TAKEN TO AVOID ANY
06700 ;WRITING ON POINTS NOT IN THE ARRAY GBOARD.
06800 ;**********
06900 INFLSB: SKIPA TAC4,[MOVN TAC1,@TAC2] ;SUBTRACT INFLUENCE
07000 MOVE TAC4,[SKIPE TAC1,@TAC2] ;ADD INFLUENCE
07100 MOVEM TAC4,ADDSUB
07200 ;*****SET INDICIES USING THE (I,J) COORDINATES
07300 MOVE TAC4,TAC
07400 IDIVI TAC4,BRDWTH
07500 CAIG TAC4,2 ;TAC4 IS THE I-COORD
07600 SKIPA TAC3,GBDADJ-1(TAC4) ;TAC3 WILL BE BOARD INDIR ADDR
07700 SKIPA TAC3,GBDADJ+2
07800 SKIPA TAC2,INFADJ-1(TAC4) ;TAC2 WILL BE INFLTB INDIR ADDR
07900 HRLZI TAC2,TAC5 ;MAKE TAC2 CONTROLLED BY TAC5
08000 ADDI TAC3,GBOARD-3*BRDWTH-3(TAC)
08100 ADD TAC2,INFLTB
08200 HRRZ TAC4,ELTNOS-1(TAC4) ;TAC4 IS ROW COUNTER
08300 CAILE TAC5,2 ;TAC5 IS THE J-COORD
08400 JRST .+3
08500 ADD TAC3,JSTART-1(TAC5)
08600 ADD TAC2,JSTART-1(TAC5)
08700 HRRZ TAC5,ELTNOS-1(TAC5) ;TAC5 IS COLUMN COUNTER
08800 MOVEM TAC5,T5SAV
08900 ADDSUB: 0 ;SET FOR ADD OR SUB
09000 ADDM TAC1,@TAC3
09100 SOJGE TAC5,ADDSUB
09200 MOVE TAC5,T5SAV
09300 ADDI TAC3,BRDWTH
09400 ADDI TAC2,7
09500 SOJGE TAC4,ADDSUB
09600 POPJ PDP,
09700
09800 ;**********CHECK FOR THE SIMPLE ILLEGAL MOVES
09900 SETZM FORCMV
10000 STRT: MOVE TAC,-4(PDP) ;I-COORDINATE
10100 MOVE TAC1,-3(PDP) ;J-COORDINATE
10200 MOVE BWREG,-2(PDP)
10300 ANDI BWREG,1
10400 AOS BOARDS
10500 JUMPLE TAC,BADMOV ;START OFF-BOARD CHECK
10600 JUMPLE TAC1,BADMOV
10700 CAIL TAC,BRDWTH-1
10800 JRST BADMOV
10900 CAIL TAC1,BRDWTH-1
11000 JRST BADMOV
11100 IMULI TAC,BRDWTH
11200 ADD TAC,TAC1 ;1-D BOARD COORDINATE IN TAC
11300 MOVEI BLANK,BNKOCC
11400 TDNN BLANK,GB1(TAC)
11500 JRST DBLMOV ;POINT ALREADY OCCUPIED
11600 MOVEM TAC,TACSAV ;SAVE MOVE COORDINATE
11700 HLRZ FRIEND,FRND(BWREG)
11800 CAME TAC,KOTAC
11900 POPJ PDP,
12000 MOVEI TAC1,3
12100 TDNE FRIEND,@GB1TST(TAC1)
12200 POPJ PDP, ;WE ARE FILLING KO
12300 SOJGE TAC1,.-2
12400 JRST BADKO ;ILLEGAL KO RETAKE
12500
12600 ;**********SET UP STRINGS IN THE LOCAL AREA
12700 SETOM FORCMV
12800 STRNGS: MOVE STKREG,STKPTR ;REGISTER FOR STRING STACKING
12900 SETZM STRNUM ;NAME STORAGE FOR EACH STRING
13000 SETZM CAPTST ;CAPTURED STRING TAC STORAGE
13100 SETZM TACCPT ;NUMBER OF MEN CAPTURED THIS TURN
13200 MOVEI SEARCH,CAPTST ;ADDRESS OF CAP STRING STORAGE
13300 SETZ REPLCE, ;BECOMES NAME OF CURRENT STRING
13400 HRL TAC1,TAC
13500 HRRI TAC1,AWSLRH
13600 MOVEM TAC1,NSTRNG ;START OF DATA FOR CURRENT (FORMING) STRING
13700 ;*****NEIGHBOR ANALYSIS (AND SETUP FOR MAKING A MOVE)
13800 SETZ TAC1, ;HOLDS # MEN, # LIBS OF LARGEST SUBSTR
13900 MOVEI TAC4,3
14000 P1LOP: MOVEI TAC2,STRBTS*STRCNT
14100 AND TAC2,@GB1TST(TAC4) ;STRING NAME IN TAC2
14200 JUMPE TAC2,P1LOP1-1 ;STRING #=0 MEANS POINT IS VACANT
14300 CAIN TAC2,STRBTS*STRCNT
14400 JRST P1LOP1 ;STRING #=177 MEANS POINT IS OFF EDGE
14500 MOVEI TAC5,STRNUM ;DUPLICATION CHECK
14600 SKIPN TAC3,0(TAC5)
14700 JRST .+4
14800 CAME TAC2,TAC3
14900 AOJA TAC5,.-3
15000 JRST DUPCAP ;DUPLICATION
15100 MOVEM TAC2,0(TAC5) ;SAVE STRING NAME
15200 SETZM 1(TAC5)
15300 PUSH STKREG,TAC2 ;SAVE STRING NAME ON STACK
15400 PUSH STKREG,STRPTR(TAC2) ;SAVE STRING DATA ON STACK
15500 TDNN FRIEND,@GB1TST(TAC4) ;IS STRING FRIENDLY
15600 JRST ENSTRG
15700 HRLZI TAC3,777000
15800 AND TAC3,STRPTR(TAC2) ;GET STRING STATUS BITS
15900 ORM TAC3,NSTRNG
16000 HRRZ TAC3,STRPTR(TAC2) ;ADD FRIENDLY DATA TO NSTRNG
16100 SUBI TAC3,1 ;BECAUSE OF NEW MAN AT TAC
16200 ADDM TAC3,NSTRNG
16300 CAMG TAC3,TAC1 ;TEST FOR BIGGEST FRIENDLY SUBSTR
16400 JRST P1LOP1
16500 MOVE REPLCE,TAC2 ;DEFINE NAME OF BIGGEST
16600 MOVE TAC1,TAC3 ;DEFINE SIZE OF BIGGEST
16700 JRST P1LOP1
16800 DUPCAP: LDB TAC2,[POINT 9,STRPTR(TAC2),17]
16900 MOVEI TAC5,CAPTST ;SHOULD ADD AN EXTRA LIB TO NSTRNG WHEN
17000 SKIPN TAC3,0(TAC5) ;DUP IS OF A CAPTURED STRING
17100 JRST P1LOP1
17200 CAME TAC2,TAC3
17300 AOJA TAC5,.-3
17400 JRST P1LOP1-1
17500 ENSTRG: LDB TAC3,[POINT 27,STRPTR(TAC2),35]
17600 TRNE TAC3,AWSRRH*(AWSRRM-1)
17700 JRST P1LOP1
17800 ENCAPT: HLRM TAC3,0(SEARCH) ;SAVE TAC OF CAPTURED STRING FOR ERASING
17900 SETZM 1(SEARCH)
18000 AOJ SEARCH,
18100 HRRZ TAC3,TAC3
18200 LSH TAC3,LRHSHF
18300 ADDM TAC3,TACCPT ;# STONES CAPTURED
18400 AOS NSTRNG ;BLANK OR CAPTURED ENEMY ADDS LIB TO NSTRNG
18500 P1LOP1: SOJGE TAC4,P1LOP
18600 MOVEI TAC1,AWSRRH*AWSRRM
18700 AND TAC1,NSTRNG
18800 JUMPE TAC1,NOLBTY ;NO LIBS IN NSTRNG MEANS ILLEGAL MOVE
18900 SKIPGE TAC5,FORCMV
19000 JRST NEIIN0+1
19100 POPJ PDP,
00100 ;**********FIND FRIENDLY GROUP NAMES
00200 GPPINT: JUMPE TAC1,.+2 ;NO GROUP
00300 CAIN TAC1,GRPBTS
00400 POPJ PDP, ;HAFCON
00500 HRRZ TAC3,GRPPTR+MXARNO(TAC1)
00600 TDNN FRIEND,GB1(TAC3) ;GROUP BASE POINT
00700 POPJ PDP, ;ENEMY GROUP
00800 HRRZ TAC3,GRPPTR(TAC1)
00900 TRNE TAC3,777000
01000 JRST GPPNT1
01100 SOS EYENUM-1 ;GROUP HAS NO (LIVING) STONES
01200 POPJ PDP,
01300 GPPNT1: MOVEI TAC3,WHTARM
01400 SKIPN TAC4,0(TAC3)
01500 JRST .+4 ;NO MORE NAMES
01600 CAME TAC1,TAC4
01700 AOJA TAC3,.-3
01800 POPJ PDP, ;NAME ALREADY THERE
01900 MOVEM TAC1,0(TAC3) ;RECORD NEW NAME
02000 SETZM 1(TAC3)
02100 POPJ PDP,
02200
02300 ;**********
02400 ; FIND OUT IF POINT IS FRIENDLY OR ENEMY. THE PARTICULAR
02500 ;POINT IS DETERMINED BY THE VALUES OF TAC AND TAC2. TAC1=0 MEANS
02600 ;POINT IS FRIENDLY, TAC3=0 MEANS POINT IS BLANK.
02700 ;**********
02800 ENFRGP: LDB TAC3,[POINT 7,@GB1TST(TAC2),28]
02900 JUMPE TAC3,ENFRG2 ;BLANK IS "FRIENDLY"
03000 CAIE TAC3,GRPBTS
03100 JRST ENFRG1
03200 HRRZ TAC3,WBHCON(BWREG)
03300 TDNN TAC3,@GBDTST(TAC2)
03400 POPJ PDP, ;"ENEMY" HAFCON
03500 JRST ENFRG2 ;"FRIENDLY" HAFCON
03600 ENFRG1: HRRZ TAC1,GRPPTR+MXARNO(TAC3)
03700 TDNE FRIEND,GB1(TAC1)
03800 ENFRG2: SETZ TAC1,
03900 POPJ PDP,
04000
04100 ;**********
04200 ; TEST THE POINTS NEAR A PROPOSED "PATTERN A" SPLIT TO SEE IF
04300 ;THE SPLIT SIDE WILL STILL BE CONNECTED AFTER THE SPLITTING MOVE.
04400 ;"ENEMY" IS THE SIDE BEING SPLIT.
04500 ;**********
04600 TESTIT: TDNN BLANK,0(TAC2) ;TAC2 HAS GB1 ADDRESS OF POINT
04700 JRST TESTI3
04800 MOVE TAC4,GBOARD-GB1(TAC2)
04900 CAIE ENEMY,BLKOCC
05000 JRST TESTI4
05100 TRNE TAC4,NGHBTS*WHTNGH
05200 AOJA TAC1,TESTI2+1
05300 ANDI TAC4,NGHBTS*BLKNGH
05400 CAIGE TAC4,3*BLKNGH
05500 TESTI2: AOJ TAC1,
05600 POPJ PDP,
05700 TESTI4: TRNE TAC4,NGHBTS*BLKNGH
05800 AOJA TAC1,TESTI2+1
05900 ANDI TAC4,NGHBTS*WHTNGH
06000 CAIGE TAC4,3*WHTNGH
06100 AOJ TAC1,
06200 POPJ PDP,
06300 TESTI3: MOVE TAC4,0(TAC2)
06400 TRNE TAC4,NONOCC
06500 AOJA TAC1,TESTI2
06600 ANDI TAC4,177
06700 MOVE TAC4,STRPTR(TAC4)
06800 TDNN ENEMY,0(TAC2)
06900 JRST TESTI1
07000 TLNE TAC4,DEDBIT
07100 AOJA TAC1,TESTI2
07200 POPJ PDP,
07300 TESTI1: TLNE TAC4,DEDBIT
07400 SOJA TAC1,TESTI2+1 ;DEAD FRIENDLY, SO SPLIT UNLIKELY
07500 TRNE TAC4,176
07600 AOJ TAC1, ;FRIENDLY HAS >1 LIBERTY
07700 JRST TESTI2
07800
07900 ;**********
08000 ; CHECK OUT POINT TAC TO SEE IF IT IS AN ATE POINT FOR FRIENDLY
08100 ;(I.E., IF ENEMY PLAYS THERE HE ATARIS HIMSELF OR SUICIDES)
08200 ;IF THE POINT IS AN ENEMY ATE POINT, THEN ADD 2 TO TAC2 (HOLDS
08300 ;DIAGS TEST COUNT IN EYDIAG). IF THE POINT IS AN ENEMY TWOLIB
08400 ;POINT, THEN TURN ON THE LEFTHALF BITS OF TAC.
08500 ;**********
08600 EYDIXX: 0 ;THESE WORDS CAN BE SET EXTERNALLY
08700 EYDIX1: 0
08800 ATEPNT: SETOM EYDIXX
08900 MOVEM TAC3,EYDIX1
09000 MOVEI TAC1,3
09100 EYDIA4: LDB TAC3,[POINT 7,@GB1TST(TAC1),35]
09200 SKIPN TAC3
09300 AOSA EYDIXX ;COUNT ONE BLANK
09400 CAIL TAC3,177
09500 JRST EYDIA3
09600 LDB TAC3,[POINT 9,STRPTR(TAC3),35]
09700 TDNN FRIEND,@GB1TST(TAC1)
09800 JRST .+4
09900 CAIG TAC3,1
10000 AOS EYDIXX ;FRIENDLY ATARIED NEIGHBOR
10100 JRST EYDIA3
10200 ADDM TAC3,EYDIXX
10300 SOS EYDIXX ;ADD # ENEMY LIBS - 1
10400 EYDIA3: SOJGE TAC1,EYDIA4
10500 SKIPLE TAC3,EYDIXX
10600 AOSA EYENUM-1 ;POTENTIAL DIAGONAL POINT
10700 ADDI TAC2,2 ;BONUS FOR EYDIAG, ETC.
10800 CAIG TAC3,1
10900 HRRO TAC,TAC ;MARK TWOLIB POINT
11000 EXCH TAC3,EYDIX1
11100 POPJ PDP,
11200
11300 ;**********
11400 ; TEST DIAGONAL OFFSETS OF TAC FOR POSSIBLE EYE CONFIGURATION.
11500 ;IF TAC2≥5 THEN WE PASS. COUNT 1 FOR OFF EDGE AND 2 FOR A POINT WHERE
11600 ;THE OPPONENT CANT PLAY OR WOULD SELF-ATARI HIMSELF.
11700 ;**********
11800 EYDIAG: SETZ TAC2,
11900 SETZM EYENUM-1 ;COUNTS POTENTIAL DIAGONAL MOVES
12000 MOVEI TAC3,3
12100 SETZM EYENUM(TAC3) ;ZERO EYE-MAKER ADDRESS HOLDER
12200 MOVE TAC1,@G1DIAG(TAC3)
12300 TRNE TAC1,NONOCC
12400 AOJA TAC2,EYDIA1 ;OFF EDGE
12500 TDNE FRIEND,TAC1
12600 AOJA TAC2,.-2 ;FRIENDLY-OCCUPIED
12700 MOVEM TAC2,EYENUM(TAC3)
12800 PUSH PDP,TAC
12900 MOVEI TAC,@G1DIAG(TAC3)
13000 SUBI TAC,GB1 ;GET DIAG OFFSET INTO TAC
13100 TRNE TAC1,BNKOCC
13200 JRST EYDIA ;TEST DIAG OFFSET FOR ENEMY SELF-ATE
13300 ANDI TAC1,177
13400 MOVE TAC1,STRPTR(TAC1)
13500 TRNE TAC1,776
13600 JRST EYDIA+2 ;TOO MANY LIBERTIES
13700 MOVEI TAC1,3 ;GET BLANK NEXT TO ENEMY
13800 MOVE TAC2,@GB1TST(TAC1)
13900 TRNN TAC2,BNKOCC
14000 SOJGE TAC1,.-2
14100 MOVE TAC2,EYENUM(TAC3)
14200 JUMPL TAC1,EYDIA+2
14300 MOVEI TAC,@GODOWN(TAC1) ;USE THIS BLANK FOR ATEPNT
14400 EYDIA: PUSHJ PDP,ATEPNT
14500 CAME TAC2,EYENUM(TAC3)
14600 SETZ TAC, ;ATEPNT FOUND AN OK DIAG BLANK
14700 MOVEM TAC,EYENUM(TAC3)
14800 POP PDP,TAC
14900 EYDIA1: SOJGE TAC3,EYDIAG+3
15000 POPJ PDP,
15100
15200 ;**********
15300 ; USE EYDIAG AND KNOWLEDGE THAT TACSV1 CONTAINS THE CURRENT MOVE
15400 ;POINT TO SEE IF THE CURRENT MOVE MAKES AN EYE FOR ENEMY. IF IT DOES,
15500 ;RETURN TAC1 AS "FRDEYE". IF IT THREATENS TO, RETURN TAC1 AS "FRDTIG".
15600 ;**********
15700 EYCHEK: TRCE FRIEND,BLKOCC+WHTOCC
15800 TRNN FRIEND,BLKOCC+WHTOCC
15900 SAILERR <1> ;FRIEND NOT BLACK OR WHITE
15950 ;**** ERROR MESSAGE 1 ****
16000 PUSHJ PDP,EYDIAG
16100 XORI FRIEND,BLKOCC+WHTOCC
16200 SKIPL TACSV1
16300 JRST EYCHK1-1
16400 ;*****ANSWER FOR NOLBTY CASE (WHEN TRYING "ILLEGAL MOVE" FOR EYE)
16500 CAIL TAC2,5
16600 JRST EYCHK3 ;WE HAVE AN EYE ALREADY
16700 CAIGE TAC2,3
16800 JRST EYCHK4 ;WE CANT MAKE AN EYE IN ONE MORE MOVE
16900 JRST EYCHK5 ;CAN MAKE AN EYE IN ONE MORE MOVE
17000 ;*****ANSWER FOR ALL OTHER CASES
17100 MOVEI TAC1,3
17200 EYCHK1: MOVE TAC3,EYENUM(TAC1)
17300 CAMN TAC3,TACSV1
17400 JRST EYCHK2-2
17500 JUMPGE TAC3,EYCHK2
17600 HRRZ TAC3,TAC3
17700 SUB TAC3,TACSV1
17800 MOVM TAC3,TAC3
17900 CAIE TAC3,BRDWTH
18000 SOJN TAC3,EYCHK2
18100 SOS EYENUM-1 ;ONE LESS AVAILABLE BLANK
18200 ADDI TAC2,2 ;TWOLIB BECOMES SELF-ATE
18300 EYCHK2: SOJGE TAC1,EYCHK1
18400 CAIGE TAC2,5
18500 JRST .+3
18600 EYCHK3: MOVEI TAC1,FRDEYE ;AN EYE IS FORMED
18700 POPJ PDP,
18800 MOVE TAC3,EYENUM-1 ;# AVAILABLE BLANKS AT DIAGS
18900 CAIE TAC2,4
19000 JRST .+4
19100 CAIL TAC3,2
19200 JRST EYCHK3
19300 JRST EYCHK4+2 ;SEE IF BLANKS HELP
19400 CAIL TAC2,3
19500 JRST .+3
19600 EYCHK4: SETZ TAC1, ;NOT THREAT FOR EYE
19700 POPJ PDP,
19800 ADD TAC3,TAC3
19900 ADD TAC3,TAC2
20000 CAIGE TAC3,5
20100 JRST EYCHK4
20200 EYCHK5: MOVEI TAC1,FRDTIG ;THREAT TO MAKE EYE
20300 POPJ PDP,
20400
20500 ;**********IF FORCMV>0 CHECK FOR OCCURRENCE OF ENEMY EYE
20600 NOLBTY: SKIPG FORCMV
20700 JRST NOLBT1
20800 MOVE TAC,TACSAV
20900 SETOM TACSV1
21000 PUSHJ PDP,EYCHEK ;CHECK EYE FOR NON-MOVER
21100 CAIE TAC1,FRDEYE
21200 JRST EYEMKR
21300 ;*****RECORD NEW EYE AND ADD IT TO ITS GROUP
21400 EYMKR1: MOVEI TAC3,EYE ;DEFINE EYE MARK
21500 ORM TAC3,GBOARD(TAC) ;MARK EYE
21600 MOVE ENEMY,FRIEND
21700 XORI ENEMY,BLKOCC+WHTOCC
21800 MOVEI TAC2,3
21900 TDNN ENEMY,@G1DIAG(TAC2)
22000 SOJA TAC2,.-1
22100 LDB TAC2,[POINT 7,@G1DIAG(TAC2),28]
22200 HRLZI TAC3,EYEVAL ;ADD IN # HALFEYES
22300 JUMPE TAC2,NOLBT1
22400 CAIGE TAC2,177
22500 ADDM TAC3,GRPPTR+2*MXARNO(TAC2)
22600 JRST NOLBT1
22700 EYEMKR: CAIE TAC1,FRDTIG
22800 JRST NOLBT1 ;CANT MAKE EYE IN ONE MOVE
22900 MOVEI TAC2,3
23000 TDNE FRIEND,@GB1TST(TAC2)
23100 JRST EYMKR1 ;DEAD STRING IN ENEMY EYE
23200 SOJGE TAC2,.-2
23300 MOVEI TAC2,FRDEYE
23400 CAME BWREG,TTYGUY
23500 MOVS TAC2,TAC2 ;TTYGUY EYE HERE
23600 MOVEI TAC1,3
23700 SKIPE TAC3,EYENUM(TAC1)
23800 ORM TAC2,GB3(TAC3) ;MAKES EYE HERE
23900 SOJGE TAC1,.-2
24000 ;*****ERROR RETURNS
24100 NOLBT1: SKIPA 1,[4] ;SUICIDE PLAY
24200 BADMOV: MOVEI 1,1 ;COORDINATES ARE OFF THE BOARD
24300 JRST EXITPT+1
24400 BADKO: SKIPA 1,[2] ;ILLEGAL KO RETAKE
24500 NOSTR: MOVEI 1,5 ;NO STRINGS LEFT
24600 JRST EXITPT+1
24700 DBLMOV: SKIPA 1,[3] ;POINT ALREADY OCCUPIED
24800 EXITPT: SETZ 1, ;MOVE IS LEGAL
24900 POP PDP, ;GET RID OF EXTRA PUSHJ
25000 SUB PDP,[XWD 4,4]
25100 JRST @4(PDP)
00100 ;**********
00200 ; TACEVL GETS A TRANSLATION FROM BITS IN GB3 TO A VALUE FOR MOVE
00300 ;PREDICTION. IT CAN BE CALLED ANY TIME AFTER GB3 HAS BEEN SET FOR THE
00400 ;CURRENT SITUATION.
00500 ;**********
00600 TACEVL: MOVE TAC4,-1(PDP) ;ARRAY OF LINEAR COEFFICIENTS
00700 MOVE TAC,-2(PDP) ;ADDRESS OF POINT IN QUESTION
00800 HRLI TAC4,TAC2 ;MAKE COEFF ADDR INDIRECT
00900 MOVEI TAC2,=35 ;THERE ARE 36 BITS IN A WORD
01000 MOVE TAC3,-3(PDP) ;SIDE BEING LOOKED AT
01100 CAME TAC3,TTYGUY
01200 SKIPA TAC3,GB3(TAC)
01300 MOVS TAC3,GB3(TAC)
01400 MOVEI TAC5,1
01500 SETZ TAC,
01600 TDNE TAC3,TAC5
01700 ADD TAC,@TAC4 ;ADD BONUS IF ITS BIT IS ON
01800 LSH TAC5,1
01900 SOJGE TAC2,.-3
02000 JRST EXITPT+2
02100
02200 R0←0 ;NAME FOR REGISTER 0
02300 ;**********CALCULATE THE LINE 4 BIAS WEIGHT
02400 LINE4: MOVE R0,-3(PDP) ;I-COORD
02500 MOVE TAC1,R0
02600 IMULI TAC1,=21
02700 SUBI R0,=10
02800 MOVM R0,R0 ;DISTANCE FROM CENTER
02900 MOVE TAC,-2(PDP) ;J-COORD
03000 ADD TAC1,TAC ;TAC1 HAS BOARD POSITION OFFSET
03100 MOVE TAC2,GB3(TAC1)
03200 AOJN TAC2,.+3 ;IF GB3(TAC1)=-1, MOVE IS ILLEGAL
03300 MOVEI TAC,400000
03400 JRST EXITPT+2 ;ILLEGAL MOVE RETURN
03500 SUBI TAC,=10
03600 MOVM TAC,TAC
03700 CAMG R0,TAC
03800 EXCH R0,TAC ;MAKE SURE R0≥TAC
03900 SUBI R0,6 ;GIVES DISTANCE FROM LINE 4
04000 CAIGE R0,0
04100 MOVEI R0,1 ;SET TO 1 FOR HIGHER THAN LINE 4
04200 CAIE R0,1
04300 LSH R0,1 ;MAGNIFY BY TWO IF NOT LINE 3 OR 5
04400 LSH R0,2 ;MAGNIFY SMALLER COORD BY FOUR
04500 SUBI TAC,6
04600 CAIGE TAC,0
04700 MOVM TAC,TAC
04800 ADD R0,TAC ;BOARD POSITION WEIGHTING FACTOR
04900 HLRE TAC1,GBOARD(TAC1) ;INFLUENCE
05000 MOVM TAC1,TAC1
05100 IDIVI TAC1,3
05200 ADD R0,TAC1 ;POINT INFLUENCE WEIGHTING FACTOR
05300 MUL R0,-1(PDP) ;WEIGHT
05400 JRST EXITPT+2 ;TAC HAS THE ANSWER NOW
05500
05600 ;**********
05700 ; SEE HOW LITTLE WORK MUST BE DONE TO UNDO A NOMOVE. ONLY IN
05800 ;CASE OF A CAPTURE DOES THE DATA HAVE TO BE RESTORED.
05900 ;**********
06000 UNTAC1: SKIPN TAC2,CAPTST ;ANY CAPTURES TO UNDO
06100 POPJ PDP, ;NO CAPTURES, SO NO WORK
06200 SETZM FORCMV
06300 MOVE TAC,TACSAV
06400 MOVE BWREG,WBSAV
06500 MOVEI TAC5,CAPTST+1 ;NOMOVE SAVES BASE
06600 MOVE SEARCH,STRPTR ;NAME IS SET BY TACCLC
06700 JUMPN BWREG,.+4
06800 MOVEI FRIEND,BLKOCC
06900 MOVEI ENEMY,WHTOCC
07000 JRST .+3
07100 MOVEI FRIEND,WHTOCC
07200 MOVEI ENEMY,BLKOCC
07300 MOVEI BLANK,BNKOCC ;RESET FRIENDLY,ENEMY,BLANK
07400 RPLLOP: MOVEI REPLCE,STRMAX ;FIND OLD STRING NAME
07500 LDB TAC,[POINT 9,STRPTR(REPLCE),17]
07600 CAME TAC2,TAC
07700 SOJG REPLCE,.-2
07800 HRLM TAC5,0(PDP)
07900 MOVE TAC1,STRPTR(REPLCE) ;STRING DATA FOR PUTDON
08000 PUSHJ PDP,PUTDON+1 ;PUT STRING BACK
08100 HLRZ TAC5,0(PDP)
08200 SKIPE TAC2,0(TAC5) ;ANY MORE CAPTURES
08300 AOJA TAC5,RPLLOP
08400 POPJ PDP,
08500
08600 ;**********
08700 ; LEGAL1 AND LEGAL2 ARE MOVE MAKERS DURING LADDERING. WHAT IS KNOWN
08800 ;IS THE TARGET STRING BASE POINT AND THE BOARD OFFSET OF THE POINT TO BE
08900 ;PLAYED. THESE MOVE MAKERS SET UP REGISTERS AND PDL FOR "LEGAL".
09000 ;**********
09100 LEGAL1: MOVE BWREG,PFORCE ;STRING BASE POINT
09200 MOVEI TAC1,BLKOCC
09300 TDNN TAC1,GB1(BWREG) ;MOVE, STRING ARE ENEMIES
09400 JRST .+5
09500 JRST .+5
09600 LEGAL2: MOVE BWREG,PFORCE ;STRING BASE POINT
09700 MOVEI TAC1,BLKOCC
09800 TDNE TAC1,GB1(BWREG) ;MOVE, STRING ARE SAME SIDE
09900 SKIPA BWREG,[1]
10000 SETZ BWREG,
10100 MOVE TAC,-1(PDP)
10200 IDIVI TAC,BRDWTH
10300 MOVE TAC2,0(PDP) ;FAKE PDL FOR 3 ARGS
10400 MOVEM TAC2,2(PDP)
10500 ADD PDP,[XWD 2,2]
10600 MOVNI TAC2,2
10700 MOVEM TAC2,FORCMV ;WANT NEIGHBORS BUT NOT INFLUENCE
10800 PUSHJ PDP,STRT+4
10900 PUSHJ PDP,STRNGS
11000 PUSHJ PDP,MAKMOV
11100
11200 ;**********
11300 ; DECIDE EXTRA BONUS AWARDS IN GB3 FOR POINTS WHICH AFFECT LADDER
11400 ;STATUS OF GIVEN GROUPS OF STONES. THIS PROGRAM MUST BE RUN AFTER ENDANG
11500 ;HAS BEEN CALLED TO SET THE ENDANGERED GROUPS DURING THE CURRENT UPDATE.
11600 ;**********
11700 KILLIV: MOVE 0,KILSAV ;ARRAY POINTER FROM SAIL
11800 MOVE ENEMY,KLLR ;KILLER COUNTER
11900 ADD ENEMY,0
12000 SOJ ENEMY,
12100 KLLOOP: CAMLE 0,ENEMY
12200 JRST SVLOOP-2 ;NO MORE KILLERS
12300 PUSHJ PDP,KILSUB
12400 MOVE TAC1,GB3(TAC)
12500 CAMN TAC1,[-1]
12600 JRST KLLOO1
12700 LSH FRIEND,WHTSHF ;"FRIEND" IS SIDE ATTACKING STRING
12800 SKIPE PIKPIL
12900 TLO BLANK,GPNDNG ;NEAR ENDANGERED FRIENDLY
13000 SKIPE WHTARM+1 ;ARE THERE AT LEAST TWO FRIENDLIES
13100 TLO BLANK,CMFRDG ;COMBINES FRIENDLY GROUPS
13200 LDB TAC1,[POINT 9,STRPTR(SEARCH),35]
13300 SOJLE TAC1,.+3
13400 CAILE TAC2,3
13500 TLO BLANK,FRDEYE ;MAKES FRIENDLY EYE
13600 TLO BLANK,EXPFGP ;EXPANDS FRIENDLY GROUP
13700 HRLZI TAC3,NDNGST ;ELIMINATE ANY FRIENDLY SELF-ATARI
13800 CAME FRIEND,TTYGUY
13900 JRST KLLOO2
14000 MOVS BLANK,BLANK ;1-TTYGUY IS KILLING
14100 MOVS TAC3,TAC3
14200 TLO BLANK,SAVFRS ;SAVES ENEMY STONE
14300 LSH TAC2,11
14400 ADDM TAC2,GB2(TAC) ;# OF ENEMIES KILLED
14500 KLLOO2: OR BLANK,GB3(TAC)
14600 ANDCAM TAC3,BLANK
14700 MOVE TAC3,GB1(TAC)
14800 TLNE TAC3,770000 ;IF ON AREA POINT, THEN
14900 OR BLANK,[XWD EXPFRA,EXPFRA] ;CAPTURE MAKES AREA
15000 MOVEM BLANK,GB3(TAC)
15100 KLLOO1: SOJA ENEMY,KLLOOP
15200 ;*****SAVER PROCESSING STARTS HERE
15300 ADD ENEMY,SAVR ;SAVER OFFSET
15400 ADDI 0,=20 ;SAVERS START AT KILSAV+=20
15500 SVLOOP: CAMLE 0,ENEMY
15600 POPJ PDP,
15700 PUSHJ PDP,KILSUB
15800 MOVE TAC1,GB3(TAC)
15900 CAMN TAC1,[-1]
16000 JRST SVLOO1
16100 TDZ TAC1,[XWD NDNGST,NDNGST] ;ELIMINATE ANY SELF-ATARI
16200 MOVEM TAC1,GB3(TAC)
16300 SKIPE PIKPIL
16400 TRO BLANK,GPNDNG ;NEAR ENDANGERED ENEMY
16500 SKIPE WHTARM+1
16600 TRO BLANK,CMFRDG ;CONNECTS FRIENDLY STONES
16700 MOVE TAC3,STRPTR(SEARCH)
16800 TLNE TAC3,KEYBIT
16900 TLO BLANK,SPLENG ;SAVES KEY FRIENDLY STONES
17000 TRO BLANK,EXPFGP ;EXPANDS ENEMY GROUP
17100 TLO BLANK,SAVFRS ;SAVES FRIENDLY STONES
17200 LSH FRIEND,WHTSHF ;"FRIEND" IS SIDE ATTACKING STONES
17300 CAMN FRIEND,TTYGUY
17400 JRST .+3
17500 MOVS BLANK,BLANK ;1-TTYGUY IS SAVING
17600 ADDM TAC2,GB2(TAC) ;# OF FRIENDLY STONES SAVED
17700 ORM BLANK,GB3(TAC)
17800 SVLOO1: SOJA ENEMY,SVLOOP
17900
18000 ;*****BOOKKEEPING FOR KILLIV
18100 KILSUB: SETZ BLANK, ;HOLDS NEW AWARD BITS
18200 HLRZ SEARCH,0(ENEMY) ;STRING #
18300 PUSHJ PDP,CONNCT ;GET NEIGHBORING ENEMY GROUPS
18400 HLRZ SEARCH,0(ENEMY)
18500 MOVE TAC5,MSCVAL
18600 HRLZ TAC5,=22(TAC5) ;"ENDANGERED GROUP" CUTOFF
18700 SETZM PIKPIL
18800 MOVEI TAC1,WHTARM
18900 KILSU1: SKIPN TAC2,0(TAC1)
19000 JRST KILSU2
19100 SKIPL TAC2 ;SIGNAL THAT WE HAVE KEYNESS
19200 CAMLE TAC5,GRPPTR+MXARNO(TAC2)
19300 SETOM PIKPIL ;STRING STATUS AFFECTS ENDANGERED GROUP
19400 AOJA TAC1,KILSU1
19500 KILSU2: LDB TAC2,[POINT 9,STRPTR(SEARCH),26]
19600 HRRZ TAC,0(ENEMY) ;MOVE POINT WE ARE REWARDING
19700 MOVE TAC3,TAC
19800 IDIVI TAC3,BRDWTH
19900 CAIG TAC3,BRDWTH-2
20000 CAIGE TAC3,1
20100 SAILERR <2> ;******** ERROR MESSAGE 2 ********
20200 CAIG TAC4,BRDWTH-2
20300 CAIGE TAC4,1
20400 SAILERR <3> ;******** ERROR MESSAGE 3 ********
20500 POPJ PDP,
00100 ;**********
00200 ; CALCULATE SOME FAIRLY IMPORTANT TACTICAL QUANTITIES. NOTE THAT
00300 ;NO CHANGE IS MADE IN THE GAME DATA STRUCTURE, UNLESS ONE OR
00400 ;MORE STONES GET CAPTURED. SOME DATA GENERATED BY THE
00500 ;LEGAL MOVE CHECKER IS USED BY TACCLC.
00600 ;**********
00700 NOMOVE: MOVEI TAC1,1
00800 MOVEM TAC1,FORCMV ;SIGNAL TO CHECK FOR EYES IF MOVE IS A SUICIDE
00900 PUSHJ PDP,STRT
01000 PUSHJ PDP,STRNGS
01100 PUSH PDP, ;TO GET THE EXTRA LEVEL OF STACK DEPTH
01200 MOVEM 16,R16SAV ;SAVE REGISTER 16 FOR SAIL
01300 SETZ 16, ;REG 16 WILL HOLD TACTICAL DATA MARKS
01400 MOVEI ENEMY,WHTOCC+BLKOCC
01500 XOR ENEMY,FRIEND ;SET UP TEST FOR ENEMY STONE
01600 MOVEM TAC,TACSV1 ;USED IN EYCHEK
01700 MOVEI TAC4,STRNUM
01800 TACLOP: SKIPN SEARCH,0(TAC4)
01900 JRST TACLP1
02000 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
02100 MOVE TAC2,STRPTR(SEARCH)
02200 TLNN TAC2,DEDBIT
02300 JRST TACLO1
02400 TDNE FRIEND,GB1(TAC)
02500 TROA 16,NDNGST ;MARK ADDITION TO DEAD STRING
02600 TLOA 16,NDNGST ;MARK CAPTURE OF DEAD STRING
02700 AOJA TAC4,TACLOP
02800 TACLO1: MOVEI TAC1,AWSRRH*AWSRRM
02900 AND TAC1,TAC2
03000 TDNN FRIEND,GB1(TAC)
03100 JRST ESTRG
03200 CAIL TAC1,2
03300 AOJA TAC4,TACLOP ;MORE THAN ONE LIBERTY
03400 TRO 16,SAVFRS ;FRIENDLY STONES UNATARIED
03500 ;**********SEE IF ENEMY PLAY AT THIS POINT WILL MAKE AN EYE
03600 LDB TAC2,[POINT 9,STRPTR(SEARCH),26]
03700 SOJG TAC2,.+3
03800 PUSHJ PDP,EYCHEK
03900 TLO 16,0(TAC1)
04000 AOJA TAC4,TACLOP
04100 ESTRG: SOJG TAC1,ESTRG1
04200 HRLM TAC4,0(PDP) ;CHECK CAPTURES FOR SAVING FRIENDLIES
04300 MOVE REPLCE,STRPTR
04400 SETZM WBSAV ;HOLDS GROUP NAMES FOR LIBCHK
04500 MOVE TAC3,[JRST LIBCHK]
04600 MOVE TAC1,STRPTR(SEARCH) ;STRING DATA FOR PICKUP
04700 PUSHJ PDP,PICKUP+2
04800 HLRZ TAC4,0(PDP)
04900 AOJA TAC4,TACLOP
05000 ESTRG1: CAILE TAC1,2
05100 AOJA TAC4,TACLOP
05200 SOJG TAC1,.+2
05300 TROA 16,ATARES ;#STRINGS ATARIED
05400 TRO 16,TWOLES ;#STRINGS 2-LIBBED
05500 AOJA TAC4,TACLOP
05600 TACLP1: MOVE TAC,TACSAV ;RESTORE BASE POINT
05700 ;*****TRY FOR EYEMAKER AND USEFUL TIGERMOUTH LEADING TO EYEMAKER
05800 LDB TAC5,[POINT 9,NSTRNG,35] ;# LIBERTIES
05900 CAILE TAC5,2
06000 JRST GROUPV ;MORE THAN TWO LIBERITES
06100 SOJG TAC5,TACLP2
06200 SKIPN TACCPT
06300 TRZ 16,SAVFRS ;IF NO CAPTURE, THEN NOONE IS SAVED
06400 TRO 16,NDNGST ;SELF-ATARI FOR FRIENDLY
06500 JRST TACLP3
06600 TACLP2: TRO 16,TWOLFS ;2-LIBBED FRIENDLY
06700 SKIPE TACCPT ;DONT ALLOW ANY CAPTURES HERE
06800 JRST GROUPV ;POINT NOT LIKELY EYE
06900 TACLP3: MOVEI TAC4,3
07000 TDNN BLANK,@GB1TST(TAC4)
07100 JRST GROUPV-1
07200 MOVEI TAC3,@GODOWN(TAC4)
07300 MOVEM TAC3,TACSV1 ;SET UP TACSV1 FOR EYCHEK
07400 PUSHJ PDP,EYCHEK
07500 JUMPE TAC1,GROUPV-1
07600 JUMPE TAC5,.+2
07700 MOVEI TAC1,FRDTIG ;CANT MAKE EYE IF DONT CAPTURE
07800 CAME BWREG,TTYGUY
07900 MOVS TAC1,TAC1 ;CREDIT GOES TO SIDE NOT MOVING
08000 MOVEI TAC2,3
08100 TDNE BLANK,@GB1TST(TAC2)
08200 ORM TAC1,@GB3TST(TAC2) ;IF ONE POINT DESERVES REWARD,
08300 SOJGE TAC2,.-2 ;GIVE IT TO EVERYBODY
08400 JRST GROUPV
08500 SOJGE TAC4,TACLP3+1
08600 ;**********ADJACENT POINT GROUP VALUE INSPECTION
08700 GROUPV: SETZM NFRND
08800 SETZM NENEMY
08900 SETZM NBLANK
09000 SETZM NBLNKS ;HOLDS # BLANK NGH POINTS
09100 SETZM WHTARM ;HOLDS NAMES OF FRIENDLY GROUPS
09200 SETZM EYENUM-1 ;≠0 IF EXPANDS DEAD FRIENDLY GROUP
09300 SETZM EYENUM ;HOLDS SPLIT TEST ADDRESS
09400 SETZM EYENUM+1 ;≠0 MEANS FOUND OFF-EDGE POINT
09500 SETZM EYENUM+2 ;COUNTS # SECURE CONNECTIONS
09600 SETOM EYENUM+3 ;COUNTS BAD HALFCONS MADE BY MOVE
09700 SETZ TAC2,
09800 PUSHJ PDP,ENFRGP ;FIND OUT IF LAST SIDE IS BAD
09900 JUMPE TAC1,.+3
10000 MOVEM TAC3,GRUPNO+4 ;ENEMY GROUP NAME (OR HAFCON)
10100 JRST .+2
10200 MOVNM TAC3,GRUPNO+4 ;FRIENDLY GROUP NAME (OR ZERO)
10300 MOVEI TAC2,3
10400 GROUPS: LDB TAC1,[POINT 7,@GB1TST(TAC2),28]
10500 JUMPE TAC1,GROPS1
10600 CAIE TAC1,GRPBTS
10700 JRST GRUPEF ;POINT IS IN A GROUP
10800 SKIPA TAC3,[JRST NOTBNK] ;SET FOR HAFCON
10900 GROPS1: MOVE TAC3,[SETZ TAC1,] ;SET FOR NOTCON
11000 MOVEM TAC3,GROPS3
11100 TDNE BLANK,@GB1TST(TAC2)
11200 JRST GROPS2
11300 SETZ TAC1,
11400 MOVE TAC3,@GB1TST(TAC2)
11500 TRNN TAC3,BLKOCC+WHTOCC
11600 SETOM EYENUM+1 ;OFF-EDGE POINT
11700 JRST GROUPB
11800 GROPS2: MOVE TAC3,@GBDTST(TAC2)
11900 TRNN TAC3,377
12000 AOS NBLNKS ;NON-DAME BLANK NEIGHBOR
12100 ;*****GET GROUP CONNECTIONS
12200 LDB TAC1,[POINT 7,@G1DIAG(TAC2),28]
12300 PUSHJ PDP,GPPINT
12400 LDB TAC1,[POINT 7,@G1IKKN(TAC2),28]
12500 PUSHJ PDP,GPPINT
12600 SKIPN GRUPNO+1(TAC2)
12700 JRST .+3
12800 LDB TAC1,[POINT 7,@G1DIAG+1(TAC2),28]
12900 PUSHJ PDP,GPPINT
13000 ;*****CAN THERE BE HALFCONS
13100 GROPS3: 0 ;*****SET AT GROPS1 FOR NOCON OR HAFCON
13200 MOVE TAC5,@GBDTST(TAC2)
13300 TRNE TAC5,(BLKNGH+WHTNGH)*NGHBTS
13400 JRST .+3
13500 AOS NBLANK ;NO NEIGHBORS, NO HALFCON POSSIBLE
13600 JRST GROUPB
13700 ;*****CHECK FOR HALFCON CREATION
13800 SETZ TAC4, ;DETECTS NEARBY DEAD FRIENDLY
13900 TDNE FRIEND,@G1IKKN(TAC2)
14000 JRST GRUPS1
14100 GRUPS3: HRLZI TAC3,DEDBIT
14200 TDNN FRIEND,@G1DIAG(TAC2)
14300 JRST GRUPS2
14400 LDB TAC5,[POINT 7,@G1DIAG(TAC2),35]
14500 TDNE TAC3,STRPTR(TAC5)
14600 SOJA TAC4,GRUPS2
14700 TDNN ENEMY,@GB1TST+3(TAC2)
14800 JRST GRUPS2
14900 LDB TAC5,[POINT 7,@GB1TST+3(TAC2),35]
15000 TDNN TAC3,STRPTR(TAC5)
15100 JRST GOTHAF ;CROSS-CUT POTENTIAL HALFCON
15200 GRUPS2: TDNN FRIEND,@G1DIAG+1(TAC2)
15300 JRST GRUPS4
15400 LDB TAC5,[POINT 7,@G1DIAG+1(TAC2),35]
15500 TDNE TAC3,STRPTR(TAC5)
15600 SOJA TAC4,GRUPS4
15700 TDNN ENEMY,@GB1TST+1(TAC2)
15800 JRST GRUPS4
15900 LDB TAC5,[POINT 7,@GB1TST+1(TAC2),35]
16000 TDNN TAC3,STRPTR(TAC5)
16100 JRST GOTHAF ;CROSS-CUT POTENTIAL HALFCON
16200 GRUPS4: JUMPL TAC4,GROUPB ;EXPANDED DEAD STRING
16300 JRST GROUPF ;EXPANDED NON-DEAD STRING
16400 GRUPS1: LDB TAC5,[POINT 7,@G1IKKN(TAC2),35]
16500 MOVE TAC5,STRPTR(TAC5)
16600 TLNE TAC5,DEDBIT
16700 SOJA TAC4,GRUPS3 ;CANT HALFCONNECT TO DEAD STONE
16800 ANDI TAC5,177
16900 CAIG TAC5,2
17000 JRST GOTHAF ;MOVE CAN BE SPLIT FROM IKKEN FRIENDLY
17100 MOVE TAC3,TAC
17200 IDIVI TAC3,BRDWTH
17300 SUBI TAC3,BRDWTH/2
17400 MOVM TAC3,TAC3
17500 CAIE TAC3,BRDWTH/2-2
17600 JRST .+4
17700 CAIE TAC2,3
17800 CAIN TAC2,1
17900 JRST GROUPF ;LINE 2, NO HALFCON
18000 SUBI TAC4,BRDWTH/2
18100 MOVM TAC4,TAC4
18200 CAIE TAC4,BRDWTH/2-2
18300 JRST .+4
18400 CAIE TAC2,2
18500 CAIN TAC2,0
18600 JRST GROUPF ;LINE 2, NO HALFCON
18700 ;*****SEE IF POINTS LOCALLY CONNECTED ALREADY
18800 MOVEI TAC,@GODOWN(TAC2)
18900 PUSH PDP,TAC2
19000 EXCH FRIEND,ENEMY
19100 SETO TAC5,
19200 MOVEI TAC3,1(TAC2)
19300 GRUPS5: SETO TAC1, ;COUNTS ENEMY UNCONTROLLED POINTS
19400 MOVEI TAC2,@G1DIAG(TAC3)
19500 PUSHJ PDP,TESTIT
19600 MOVEI TAC2,@G1DIAG+1(TAC3)
19700 PUSHJ PDP,TESTIT
19800 MOVEI TAC2,@GB1TST(TAC3)
19900 PUSHJ PDP,TESTIT
20000 JUMPLE TAC1,GRUPS6 ;THIS MOVE IS NOT A SPLIT
20100 TRC TAC3,2
20200 AOJE TAC5,GRUPS5 ;TRY OTHER SIDE
20300 GRUPS6: POP PDP,TAC2
20400 EXCH FRIEND,ENEMY
20500 MOVEI TAC,@GODOWN+2(TAC2)
20600 JUMPLE TAC1,GROUPF ;THIS IS AN OK CONNECTION
20700 GOTHAF: AOS EYENUM+3 ;MOVE CREATES HALFCON
20800 JRST GROUPF
20900 ;*******LOOK AT HALFCON POINT
21000 NOTBNK: HRRZ TAC1,WBHCON(BWREG)
21100 TDNN TAC1,@GBDTST(TAC2)
21200 JRST GROUPE ;ENEMY HALFCON POINT
21300 TDNE ENEMY,@G1IKKN(TAC2)
21400 JRST NOTBN1
21500 MOVEI TAC4,3(TAC2)
21600 TDNN FRIEND,@G1DIAG(TAC2)
21700 SUBI TAC4,2
21800 HRRZ TAC5,@GBDTST(TAC4)
21900 CAIE BWREG,0
22000 LSH TAC5,-4
22100 ANDI TAC5,17
22200 CAILE TAC5,1
22300 JRST GROUPF ;DOES NOT MAKE HALFCON
22400 HRRZ TAC3,GODOWN(TAC4)
22500 ADDI TAC3,@GBIKKN(TAC2)
22600 HRRZ TAC5,0(TAC3)
22700 CAIE BWREG,0
22800 LSH TAC5,-4
22900 ANDI TAC5,17
23000 CAIG TAC5,2
23100 NOTBN1: AOS EYENUM+3 ;MOVE CREATES HALFCON
23200 JRST GROUPF
23300 GRUPEF: HRRZ TAC3,GRPPTR(TAC1)
23400 TDNE BLANK,@GB1TST(TAC2)
23500 AOS NBLNKS
23600 TRNE TAC3,777000
23700 JRST GRPEF1
23800 ;*****NO (LIVING) STONES IN THIS GROUP
23900 HRRZ TAC3,GRPPTR+MXARNO(TAC1)
24000 JUMPE TAC3,.+3
24100 TDNE FRIEND,GB1(TAC3)
24200 SOS EYENUM-1 ;DEAD FRIENDLY GROUP EXPANDER
24300 SETZ TAC1, ;THIS STRING IS DEAD
24400 JRST GROUPE+1
24500 GRPEF1: HRRZ TAC3,GRPPTR+MXARNO(TAC1)
24600 TDNN FRIEND,GB1(TAC3)
24700 JRST GROUPC
24800 MOVE TAC5,@GBDTST(TAC2)
24900 TRNE TAC5,(NGHBTS-1)*(BLKNGH+WHTNGH)
25000 JRST GRUPF1
25100 TDNN FRIEND,@G1IKKN(TAC2)
25200 JRST .+3
25300 LDB TAC5,[POINT 7,@G1IKKN(TAC2),35]
25400 JRST GRUPE1
25500 TDNN FRIEND,@G1DIAG(TAC2)
25600 JRST GRUPE2
25700 TDNN ENEMY,@GB1TST+3(TAC2)
25800 JRST GRUPF1+1 ;DIAGONAL CONNECTION
25900 LDB TAC5,[POINT 7,@G1DIAG(TAC2),35]
26000 JRST GRUPE1
26100 GRUPE2: TDNN ENEMY,@GB1TST+1(TAC2)
26200 JRST GRUPF1+1 ;DIAGONAL CONNECTION
26300 LDB TAC5,[POINT 7,@G1DIAG+1(TAC2),35]
26400 GRUPE1: LDB TAC5,[POINT 9,STRPTR(TAC5),35]
26500 CAIN TAC5,1
26600 JRST GRUPF2
26700 CAIE TAC5,2
26800 JRST GRUPF1+2
26900 TRNE 16,ATARES
27000 TRNE 16,NDNGST
27100 GRUPF2: AOS EYENUM+3 ;MOVE CREATES HALFCON
27200 JRST GROUPF-1
27300 GRUPF1: TLO 16,ENMGRP ;NEXT TO FRIENDLY STONE
27400 SETOM EYENUM+1
27500 AOS EYENUM+2 ;FRIENDLY SECURE CONNECTION
27600 PUSHJ PDP,GPPINT
27700 GROUPF: AOS TAC5,NFRND
27800 CAIN TAC5,1
27900 TDNE FRIEND,@GB1TST(TAC2) ;IS POINT OCCUPIED
28000 TRZA TAC5,777777
28100 MOVEI TAC5,@GODOWN(TAC2) ;SAVE BLANK GROUP POINT ADDRESS
28200 MOVEM TAC5,EYENUM ;≠0 IF ONE BLANK GROUP NEIGH
28300 GROUPB: MOVNM TAC1,GRUPNO(TAC2)
28400 JRST GROUPL
28500 GROUPC: TDNE ENEMY,GB1(TAC3)
28600 JRST .+3
28700 SETZM GRUPNO(TAC2) ;NOT A "REAL" GROUP
28800 JRST GROUPL
28900 LDB TAC3,[POINT 7,@GB1TST(TAC2),35]
29000 CAMN TAC3,STRPTR
29100 JRST GROUPC+2 ;THIS STRING GETS CAPTURED
29200 GROUPE: AOS NENEMY
29300 MOVEM TAC1,GRUPNO(TAC2)
29400 GROUPL: SOJGE TAC2,GROUPS
29500 SKIPE NBLNKS
29600 JRST .+3
29700 MOVEI TAC2,DAME ;THIS POINT HAS NO BLANK NEIGHBORS
29800 ORM TAC2,GBOARD(TAC);AND IS LIKELY TO BE DAME
29900 ;**********EXPANDED FRIENDLIES, CONNECTION
30000 SKIPN EYENUM+3
30100 TRO 16,BADHAF ;MOVE CREATES EXACTLY ONE BAD HALFCON
30200 SKIPG TAC2,NFRND ;# NEIGHBORS NEXT TO FRIENDLY
30300 JRST NOSEC
30400 SOJG TAC2,.+4
30500 TRNN 16,BADHAF
30600 TRO 16,SECCON
30700 JRST NOSEC
30800 TRNE 16,BADHAF
30900 SOJ TAC2,
31000 TRO 16,SECCON
31100 CAIGE TAC2,2
31200 JRST NOSEC
31300 MOVE TAC2,EYENUM+2
31400 CAILE TAC2,2
31500 TLO 16,ENMGRP ;NEXT TO ≥3 GROUP POINTS
31600 ;*****SEE IF THIS MOVE LEAVES AN OBVIOUS CUT BEHIND
31700 NOSEC: SETO TAC4,
31800 TRNN 16,ATARES+TWOLES
31900 SKIPE TACCPT
32000 JRST TRYSPL+1 ;MOVE CAPTURES OR ATARIS SOMETHING
32100 EXCH TAC,EYENUM ;GET BLANK NEIGHBOR GROUP POINT
32200 JUMPE TAC,TRYSPL
32300 PUSHJ PDP,LIBEST
32400 HRRZ TAC1,LIBVEC+1
32500 CAILE TAC1,2
32600 JRST TRYSP2
32700 TRZ 16,BADHAF ;ENEMY "SPLIT" WILL BE SELF-ATARI
32800 TRO 16,SECCON
32900 SETO TAC4,
33000 JRST TRYSPL
33100 ;*****SEE IF PROSPECTIVE CUT WILL BE OVERWHELMED
33200 TRYSP2: MOVEI TAC1,3
33300 HLRZ TAC3,WBHCON(BWREG)
33400 TDNE TAC3,@GBDTST(TAC1)
33500 AOJG TAC4,TRYSPL
33600 SOJGE TAC1,.-2
33700 ;**********ON FRIENDLY OR ENEMY GROUP POINT
33800 TRYSPL: EXCH TAC,EYENUM
33900 MOVE TAC5,FRNDON+1(BWREG)
34000 TDNN TAC5,GBOARD(TAC)
34100 JRST TRYSP1 ;NOT ON ENEMY LIBERTY
34200 TRO 16,ENMGRP ;ON ENEMY GROUP POINT
34300 TLNN 16,NDNGST ;DONT CONNECT TO DEAD STONE
34400 TLO 16,SECCON ;SECURELY CONNECTED TO ENEMY
34500 SKIPL TAC4
34600 TRO 16,BADHAF ;MOVE CAN BE CUT OFF DIRECTLY
34700 TRYSP1: HRLZI TAC1,AWSLRH
34800 SETZ TAC3,
34900 SETZ TAC2, ;HOLDS CONNECTED GROUP NAMES
35000 NOXPN1: SKIPN TAC4,WHTARM(TAC3)
35100 JRST NOXPN2
35200 ADDM TAC1,GRPPTR+MXARNO(TAC4) ;ANOTHER GROUP EXTEND POINT
35300 LSH TAC2,6
35400 OR TAC2,TAC4 ;SAVE GROUP NAME
35500 AOJA TAC3,NOXPN1
35600 NOXPN2: JUMPE TAC3,NOXPND
35700 TLNE TAC2,777777
35800 MOVEI TAC2,777777 ;CONNECTS MORE THAN THREE GROUPS
35900 CAMN BWREG,TTYGUY
36000 MOVS TAC2,TAC2 ;FRIENDLY NAMES IN BITS 18-35
36100 ORM TAC2,GB2(TAC) ;SAVE CONNECTED NAMES FOR ENDANG
36200 SKIPG EYENUM+3 ;≥2 BAD HAFCONS?
36300 CAIGE TAC3,2
36400 JRST NOXPN3 ;DOES NOT CONNECT GROUPS
36500 TRNE 16,SECCON ;AT LEAST 1 SIDE MUST BE CONNECTED SOLIDLY
36600 TRO 16,CMFRDG ;CONNECTS AT LEAST TWO FRIENDLIES
36700 MOVEI TAC3,WHTARM
36800 SKIPN TAC4,0(TAC3)
36900 JRST NOXPN3
37000 AOS GRPPTR+2*MXARNO(TAC4)
37100 AOJA TAC3,.-3
37200 NOXPN3: SKIPE NBLANK ;TRUE IF NOTHING IS ADDED TO THE GROUP
37300 JRST NOXPND-1
37400 LDB TAC1,[POINT 7,GB1(TAC),28]
37500 JUMPN TAC1,.+5
37600 MOVE TAC1,GBOARD(TAC)
37700 TRNN TAC1,NGHBTS*(BLKNGH+WHTNGH)
37800 JRST NOXPND-1 ;NON-GROUP POINT SURROUNDED BY GROUP POINTS
37900 JRST NOXPND ;USELESS POINT BETWEEN TWO WALLS
38000 CAIL TAC1,GRPBTS
38100 JRST NOXPND-1 ;PLAYING ON HALFCON EXPANDS A GROUP
38200 HRRZ TAC1,GRPPTR+MXARNO(TAC1)
38300 TDNE ENEMY,GB1(TAC1) ;IS POINT IN ENEMY GROUP
38400 TRO 16,EXPFGP ;EXPANDS FRIENDLY GROUP
38500 NOXPND: MOVE TAC1,NENEMY
38600 SKIPN TACCPT
38700 TRNE 16,SAVFRS
38800 JRST .+4
38900 CAIGE TAC1,4
39000 TRNE 16,NDNGST ;SELF-ATARI POINT?
39100 JRST XIT
39200 SUBI TAC1,2
39300 JUMPL TAC1,XIT
39400 ;**********PATTERN "B" ("DOUBLE CUT") SPLIT
39500 TDNN TAC5,GBOARD(TAC)
39600 JRST ASPLIT-1
39700 MOVEI TAC2,3
39800 BSPLIT: SKIPLE TAC1,GRUPNO(TAC2)
39900 SKIPG TAC3,GRUPNO+1(TAC2)
40000 JRST BSPLT1 ;NOT ENEMY
40100 CAME TAC1,TAC3
40200 TDNE TAC1,WBHCON(BWREG)
40300 JRST SPLTB1 ;SAME ENEMY OR HAFCON
40400 TDNN TAC3,WBHCON(BWREG)
40500 JRST BSPLT1 ;TAC1,TAC3 ARE DIFFERENT ENEMIES
40600 SPLTB1: TDNN FRIEND,@G1DIAG+1(TAC2)
40700 JRST BSPLT1
40800 MOVE TAC1,@G1DIAG+1(TAC2)
40900 ANDI TAC1,177
41000 MOVE TAC1,STRPTR(TAC1)
41100 TLNN TAC1,DEDBIT ;DEAD "SPLITTER"?
41200 TRNN TAC1,176 ;1-LIB "SPLITTER"?
41300 JRST BSPLT1
41400 LDB TAC1,[POINT 7,@G1DIAG+1(TAC2),28]
41500 CAIN TAC1,GRPBTS
41600 JRST SPLITA
41700 CAME BWREG,TTYGUY
41800 SKIPA TAC3,GB2(TAC)
41900 MOVS TAC3,GB2(TAC)
42000 LSH TAC3,6
42100 OR TAC3,TAC1 ;ADD NAME OF OTHER SPLITTING GROUP
42200 CAME BWREG,TTYGUY
42300 HRRM TAC3,GB2(TAC)
42400 CAMN BWREG,TTYGUY
42500 HRLM TAC3,GB2(TAC)
42600 SPLITA: TDO 16,[XWD CMFRDG,SPLENG] ;MOVE SPLITS ENEMY GROUPS
42700 JRST XIT
42800 BSPLT1: SOJGE TAC2,BSPLIT
42900 ;**********PATTERN "A" (OPPOSING ENEMIES) SPLIT
43000 MOVEI TAC2,1
43100 ASPLIT: SKIPLE TAC3,GRUPNO(TAC2)
43200 SKIPG GRUPNO+2(TAC2)
43300 SOJGE TAC2,ASPLIT
43400 JUMPL TAC2,XIT
43500 SETO TAC5,
43600 MOVEI TAC3,1(TAC2)
43700 ASPLT1: SETO TAC1, ;COUNTS ENEMY UNCONTROLLED POINTS
43800 MOVEI TAC2,@G1DIAG(TAC3)
43900 PUSHJ PDP,TESTIT
44000 MOVEI TAC2,@G1DIAG+1(TAC3)
44100 PUSHJ PDP,TESTIT
44200 MOVEI TAC2,@GB1TST(TAC3)
44300 PUSHJ PDP,TESTIT
44400 CAME BWREG,TTYGUY
44500 SKIPA TAC2,GB2(TAC)
44600 MOVS TAC2,GB2(TAC)
44700 TRNN TAC2,777777 ;EXPANDS FRIENDLY GROUP?
44800 SUB TAC1,NENEMY ;POTENTIAL SPLIT MAY BE OVERWHELMED
44900 JUMPLE TAC1,XIT ;THIS MOVE IS NOT A SPLIT
45000 TRC TAC3,2
45100 AOJE TAC5,ASPLT1 ;TRY OTHER SIDE
45200 JUMPG TAC1,SPLITA ;THIS IS A REAL SPLIT
45300 ;*****TIGERMOUTH AWARDS, IF ANY
45400 XIT: TRNE 16,TWOLFS ;DOES CURRENT MOVE HAVE TWO LIBERTIES
45500 TRNE 16,ATARES ;ATARIS ENEMY STRING?
45600 JRST XIT1
45700 TRNE 16,SPLENG ;DOES CURMOVE SPLIT ENEMY GROUPS
45800 SKIPE TACCPT ;DOES CURMOVE CAPTURE ANYTHING
45900 JRST XIT1
46000 SETZM PIKPIL+4 ;NONZERO IF FOUND NON-PROTECTING TIGERMOUTH
46100 CAIE BWREG,0
46200 SKIPA TAC1,[WCON]
46300 MOVEI TAC1,BCON
46400 MOVEI TAC3,BCON+WCON
46500 MOVEI TAC2,3
46600 XIT3: TDNN BLANK,@GB1TST(TAC2)
46700 JRST XIT2
46800 MOVEI TAC,@GODOWN(TAC2)
46900 MOVEI TAC4,3
47000 MOVEI TAC5,3 ;COUNTS NUMBER OF ADJACENT GROUP POINTS
47100 TDNE TAC1,@GBDTST(TAC4)
47200 SOJA TAC5,.+3 ;FOUND SPLIT SIDE GROUP POINT
47300 TDNE TAC3,@GBDTST(TAC4)
47400 AOJ TAC5, ;FOUND SPLITTING SIDE GROUP POINT
47500 SOJGE TAC4,.-4
47600 SKIPG TAC5 ;<3 SPLIT SIDE GROUP POINTS
47700 SETOM PIKPIL+4 ;FOUND NON-USEFUL TIGERMOUTH
47800 MOVEI TAC,@BACKUP(TAC2)
47900 XIT2: SOJGE TAC2,XIT3
48000 SKIPN PIKPIL+4
48100 JRST .+3
48200 TDZ 16,[XWD CMFRDG,SPLENG]
48300 JRST XIT1
48400 MOVE TAC1,BRDDPY
48500 SKIPE 0(TAC1)
48600 AOJA TAC1,.-1
48700 CAME BWREG,TTYGUY
48800 HRLM TAC1,0(TAC1) ;FRIENDLY SPLITTING POINT
48900 HRRM TAC,0(TAC1) ;SPLITTING POINT ADDRESS
49000 SETZM 1(TAC1) ;NEW END MARKER
49100 ;*****SEE IF MOVE THREATENS TO SAVE DEAD STONES
49200 XIT1: TRNE 16,SECCON
49300 TRNE 16,BADHAF
49400 JRST XIT4
49500 TRNE 16,NDNGST
49600 JRST XIT4
49700 SKIPGE EYENUM-1
49800 TRO 16,SAVFRS ;THREATENS RESCUE
49900 XIT4: CAMN BWREG,TTYGUY
50000 MOVS 16,16 ;CHANGE HALVES IF TTYGUY IS MOVING NOW
50100 ORM 16,GB3(TAC)
50200 ;**********
50300 ; WE HAVE COMPLETED THE DIRECT PROPERTY EXTRACTION FOR THIS
50400 ;POINT, ALTHOUGH MORE BITS CAN BE TURNED ON WHEN THE POINT IS PROCESSED
50500 ;FOR THE OTHER SIDE OR WHEN NEARBY POINTS ARE PROCESSED.
50600 ;**********
50700 MOVE 16,R16SAV
50800 XORI BWREG,1 ;SET BWREG FOR UNTAC1
50900 MOVEM BWREG,WBSAV
51000 JRST EXITPT
00100 ;**********
00200 ; THIS IS THE LEGAL MOVE ENTRY POINT. AFTER THE MOVE IS CHECKED FOR
00300 ;LEGALITY, IT IS ENTERED INTO THE GAME RECORD. A BACKUP FACILITY IS
00400 ;PROVIDED TO ENABLE A LOOK-AHEAD OF MORE THAN ONE PLY.
00500 ;**********
00600 LEGAL: PUSHJ PDP,STRT
00700 PUSHJ PDP,STRNGS-1
00800 PUSH PDP,
00900 ;**********
01000 ; MAKMOV ACTUALLY CHANGES THE DATA STRUCTURE TO RECORD THE MOVE
01100 ;JUST ANALYZED. FIRST THE CURRENT FRIENDLY STRING (INCLUDING THE MOVE
01200 ;AT TAC) IS PRODUCED. THEN ANY CAPTURED MEN ARE ERASED. FINALLY, THE
01300 ;POINT AT TAC IS MARKED "OCCUPIED BY FRIENDLY".
01400 ;**********
01500 MAKMOV: HRLZ TAC1,TACSAV ;PUT MARK OF (-TAC,KOTAC) ON STSTAK
01600 MOVN TAC1,TAC1
01700 HRR TAC1,KOTAC ;SAVE OLD KO POINT FOR RESTORING BY UNMOVE
01800 PUSH STKREG,TAC1
01900 EXCH STKREG,STKPTR ;UPDATE STACK POINTER
02000 SETZM NODANS ;HOLDS # STONES IN ENDANGERED FRIENDLY STRINGS
02100 ;*****KO CHECKING
02200 MOVE TAC3,TACCPT
02300 SOJN TAC3,NOKO ;IS EXACTLY ONE MAN CAPTURED
02400 HRRZ TAC1,NSTRNG
02500 TRNN TAC1,AWSRRM-1 ;DOES CURRENT MOVE HAVE EXACTLY ONE LIBERTY
02600 TRNE TAC1,AWSLRH*(AWSRRM-1) ;EXACTLY ONE FRIENDLY STONE
02700 NOKO: TDZA TAC1,TAC1 ;ZERO OUT OLD KO POINT
02800 MOVE TAC1,CAPTST ;RECORD KO LOCATION
02900 MOVEM TAC1,KOTAC
03000 HRRM STKREG,ADJSTR ;SET UP RELEASE LOOP
03100 HRRZ ENEMY,FRND(BWREG) ;NOTE ENEMY=STKREG
03200 JUMPE REPLCE,ADJSTR-1 ;NO FRIENDLY NEIGHBORS
03300 MOVE TAC1,STRPTR(REPLCE)
03400 TLNE TAC1,DEDBIT+DANBIT
03500 ADDM TAC1,NODANS ;STRING NOT ALIVE
03600 MOVEI CLEAR,AWSRRH*AWSRRM
03700 ANDM CLEAR,STRPTR(REPLCE)
03800 ANDCA CLEAR,NSTRNG
03900 ORM CLEAR,STRPTR(REPLCE) ;SET STRING DATA FOR LIB ADJUSTMENT
04000 SOS STRPTR(REPLCE) ;SUBTRACT LIB UNDER THE NEW STONE
04100 MOVE TAC,TACSAV ;ADD NEW POINT TO OLD STRING
04200 SKIPN SEARCH,STRPTR ;MAKE SURE SEARCH WILL FAIL
04300 SAILERR <4> ;STOP IF NO STRINGS LEFT
04350 ;**** ERROR MESSAGE 4 ****
04400 MOVEI CLEAR,4 ;MAKE SURE ENOUGH LIBS ARE POSSIBLE
04500 PUSHJ PDP,STRMAK
04600 AOS ADJSTR
04700 ADJSTR: SKIPG SEARCH,0
04800 JRST STRSFX
04900 CAMN REPLCE,SEARCH
05000 JRST ESTRNG+1
05100 LDB TAC,[POINT 9,STRPTR(SEARCH),17];TAC IS BASE POINT OF STRING
05200 TDNN FRIEND,GB1(TAC)
05300 JRST ESTRNG
05400 MOVE CLEAR,STRPTR(SEARCH)
05500 TLNE CLEAR,DEDBIT+DANBIT
05600 ADDM CLEAR,NODANS ;STRING NOT ALIVE
05700 ANDI CLEAR,777
05800 SOJG CLEAR,.+4 ;AT LEAST ONE POSSIBLE LIB TO FIND
05900 MOVEI CLEAR,177
06000 PUSHJ PDP,DRIVER ;REPLACE NAME, NO LIBS TO FIND
06100 JRST .+2
06200 PUSHJ PDP,STRMAK ;ADD THIS FRIENDLY TO CURRENT STRING
06300 MOVE TAC1,STRPTR ;RELEASE THE ADDED-ON STRING
06400 MOVEM TAC1,STRPTR(SEARCH)
06500 MOVEM SEARCH,STRPTR
06600 JRST .+2
06700 ESTRNG: SOS STRPTR(SEARCH) ;NEW MAN TAKES UP ONE ENEMY LIBERTY
06800 AOS ADJSTR
06900 JRST ADJSTR-1
07000 ;*****PUT IN NEW STRING IF THERE WERE NO FRIENDLY NEIGHBORS
07100 STRSFX: HRRZ TAC1,NODANS
07200 LSH TAC1,-=9
07300 MOVEM TAC1,NODANS ;# DEAD OR ENDANGERED STONES IN STRING
07400 JUMPN REPLCE,STROK ;THERE WERE NEIGHBORS IF REPLCE≠0
07500 SKIPN REPLCE,STRPTR
07600 JRST NOSTR ;NO-STRINGS-LEFT ERROR
07700 MOVE TAC,TACSAV
07800 ORM REPLCE,GB1(TAC)
07900 MOVE TAC2,NSTRNG ;PUT NSTRNG DATA INTO STRPTR(REPLCE)
08000 EXCH TAC2,STRPTR(REPLCE)
08100 MOVEM TAC2,STRPTR ;RESET FREE STRING POINTER
08200 SKIPE CAPTST
08300 PUSHJ PDP,CAPLOP-4
08400 MOVE TAC,TACSAV
08500 XORM FRIEND,GB1(TAC) ;MUST CHANGE BOARD AFTER CAPTURE PICKUP
08600 XORM BLANK,GB1(TAC)
08700 JRST STROK1
08800
08900 ;*****PICK UP THE CAPTURED STRING(S)
09000 MOVEI TAC5,40 ;SET BLANK FOR PUTBWB
09100 MOVEM TAC5,CHRACT
09200 MOVEI TAC1,CAPTST
09300 HRRM TAC1,.+1 ;NO SPARE REGISTERS FOR THIS LOOP
09400 CAPLOP: SKIPN TAC,0 ;ADDR SET BY PROGRAM
09500 POPJ PDP, ;NO MORE CAPTURED STRINGS TO PROCESS
09600 MOVE SEARCH,GB1(TAC)
09700 ANDI SEARCH,STRBTS*STRCNT
09800 MOVE TAC1,STRPTR ;RELEASE CAPTURED STRING POINTER
09900 EXCH TAC1,STRPTR(SEARCH)
10000 MOVEM SEARCH,STRPTR ;UPDATE FREE STRING POINTER
10100 PUSHJ PDP,PICKUP ;ERASE CURRENT CAPTURED STRING
10200 AOS CAPLOP
10300 JRST CAPLOP
10400
10500 STROK: MOVE TAC,TACSAV
10600 MOVE TAC1,NSTRNG
10700 TLNN TAC1,DEDBIT
10800 JRST .+3
10900 MOVEI TAC1,210 ;ERASE OCCBITS OF DEAD STRING
11000 ANDCAM TAC1,GBOARD(TAC)
11100 XORM FRIEND,GB1(TAC) ;MUST CHANGE GB1 BEFORE PICKING UP CAPTURES
11200 XORM BLANK,GB1(TAC)
11300 SKIPE CAPTST
11400 PUSHJ PDP,CAPLOP-4
11500 MOVE TAC,TACSAV
11600 STROK1: TRNN FRIEND,BLKOCC
11700 SKIPA TAC5,[127]
11800 MOVEI TAC5,102
11900 MOVEM TAC5,CHRACT
12000 SKIPN IIIDPY
12020 JRST EXITPT
12040 PUSH PDP,TAC
12060 PUSH PDP,CHRACT
12100 PUSHJ PDP,PUTBWB
12200 JRST EXITPT
12300
12400 ;**********
12500 ; WHEN THE DATA BASE HAS BEEN ADJUSTED (I.E., WHEN WE BACK UP MORE THAN
12600 ;1 PLY), THERE IS A LOT MORE TO DO. WE HAVE TO RESET A BUNCH OF REGISTERS,
12700 ;UNSTACK AND REPLACE POSSIBLE CAPTURES, AND UNDO AN ARBITRARILY LARGE
12800 ;FRIENDLY STRING CREATED ON THE LAST PLY.
12900 ;**********
13000 UNMOV1: SETOM FORCMV
13100 SOSA FORCMV
13200 UNMOVE: SETOM FORCMV
13300 MOVE STKREG,STKPTR
13400 POP STKREG,TAC
13500 HRRZM TAC,KOTAC
13600 ASH TAC,-22
13700 MOVN TAC,TAC
13800 MOVEM TAC,TACSAV
13900 MOVEI BLANK,BNKOCC
14000 MOVEI FRIEND,WHTOCC+BLKOCC
14100 AND FRIEND,GB1(TAC)
14200 MOVE BWREG,FRIEND
14300 LSH BWREG,WHTSHF
14400 ;*****RESET NEIGHBORS
14500 MOVE TAC1,GB1(TAC)
14600 ANDI TAC1,177
14700 MOVE TAC1,STRPTR(TAC1)
14800 TLNN TAC1,DEDBIT
14900 JRST .+5
15000 CAIE FRIEND,BLKOCC
15100 SKIPA TAC1,[OCCBIT*WHTNGH]
15200 MOVEI TAC1,OCCBIT*BLKNGH
15300 ORM TAC1,GBOARD(TAC)
15400 SKIPGE TAC5,FORCMV
15500 PUSHJ PDP,NEIIN2+1
15600 ;*****PROCESS POSSIBLE CAPTURES
15700 TRNE FRIEND,BLKOCC
15800 SKIPA TAC5,[127]
15900 MOVEI TAC5,102
16000 MOVEM TAC5,CHRACT
16100 MOVEI CLEAR,STRCNT*STRBTS
16200 MOVEM STKREG,STKPTR ;SAVE STKREG FOR SECOND PASS (FRLOOP)
16300 CPLOOP: SKIPG 0(STKREG)
16400 JRST CPLOO1 ;END OF STACKED STRINGS FOR THIS PLY
16500 POP STKREG,TAC1
16600 POP STKREG,REPLCE
16700 HLRZ TAC,TAC1
16800 ANDI TAC,777 ;GET RID OF FLAG BITS
16900 TDNE FRIEND,GB1(TAC)
17000 JRST CPLOOP
17100 TDNN BLANK,GB1(TAC)
17200 JRST CPLOO1-3
17300 CAME REPLCE,STRPTR ;REACQUIRE STRING DATA SLOT
17400 SAILERR <5> ;******** ERROR MESSAGE 5 ********
17500 MOVE TAC2,TAC1
17600 EXCH TAC2,STRPTR(REPLCE)
17700 MOVEM TAC2,STRPTR ;RESET STRING POINTER
17800 MOVEM STKREG,TACSV1
17900 MOVEI ENEMY,WHTOCC+BLKOCC ;NOTE ENEMY=STKREG
18000 XOR ENEMY,FRIEND
18100 PUSHJ PDP,PUTDON
18200 SKIPA STKREG,TACSV1
18300 MOVEM TAC1,STRPTR(REPLCE) ;RESTORE UNCAPTURED ENEMY
18400 SETZM 2(STKREG) ;MARK NAME FOR SECOND PASS
18500 JRST CPLOOP
18600 CPLOO1: EXCH STKREG,STKPTR ;RESET STKPTR TO TOP OF PREVIOUS PLY STACK
18700 ;*****UNDO THE CURRENT POINT
18800 MOVE TAC,TACSAV
18900 MOVEI SEARCH,STRCNT*STRBTS
19000 AND SEARCH,GB1(TAC)
19100 ANDCAM CLEAR,GB1(TAC)
19200 XORM BLANK,GB1(TAC)
19300 TDNN FRIEND,GB1(TAC)
19400 SAILERR <6> ;******** ERROR MESSAGE 6 ********
19500 XORM FRIEND,GB1(TAC)
19600 MOVEI TAC5,40
19700 MOVEM TAC5,CHRACT
19800 SKIPN IIIDPY
19820 JRST .+4
19840 PUSH PDP,TAC
19860 PUSH PDP,CHRACT
19900 PUSHJ PDP,PUTBWB
20000 MOVE TAC1,STRPTR(SEARCH)
20100 TRNE TAC1,AWSLRH*(AWSLRM-1)
20200 JRST FRLOOP
20300 ;*****RELEASE THE CURRENT (ONE-MAN) STRING
20400 MOVE TAC2,STRPTR
20500 MOVEM TAC2,STRPTR(SEARCH)
20600 MOVEM SEARCH,STRPTR
20700 POPJ PDP,
20800 ;*****RESET OLD FRIENDLY STRINGS
20900 FRLOOP: SKIPGE TAC1,0(STKREG)
21000 POPJ PDP,
21100 JUMPE TAC1,FRLOP1
21200 MOVE REPLCE,-1(STKREG)
21300 CAME SEARCH,REPLCE
21400 JRST .+3
21500 MOVEM TAC1,STRPTR(SEARCH)
21600 JRST FRLOP1
21700 CAME REPLCE,STRPTR ;REACQUIRE OLD NAME FOR A PIECE OF FRIENDLY
21800 SAILERR <7> ;******** ERROR MESSAGE 7 ********
21900 EXCH TAC1,STRPTR(REPLCE)
22000 MOVEM TAC1,STRPTR ;RESET FREE STRING POINTER
22100 LDB TAC,[POINT 9,STRPTR(REPLCE),17]
22200 PUSHJ PDP,DRIVER ;RENAME BOARD POINTS IN STRING
22300 FRLOP1: SUBI STKREG,2
22400 JRST FRLOOP
00100 BEGIN DANBLK
00200
00300 ;**********
00400 ; COUNT AVAILABLE BOARD POINTS TO EXPAND INTO FROM A PARTICULAR
00500 ;GROUP OR STRING. IF A GROUP CAN BE FREELY EXPANDED, THEN IT IS ALMOST
00600 ;SAFE. TAC MUST BE SET TO A LOCATION IN THE GROUP OR STRING, AND CLEAR
00700 ;MUST BE SET TO THE NUMBER OF ECPANSION POINTS DESIRED.
00800 ;**********
00900 NXTENM: 0
01000 EXPSPC: MOVEI TAC5,BKOUT
01100 MOVEI TAC4,NONOCC
01200 MOVE TAC2,TAC
01300 IDIVI TAC2,BRDWTH
01400 MOVEM TAC2,ICOUNT ;SET UP LINE 1 DETECTION
01500 MOVEM TAC3,JCOUNT
01600 CAIE TAC2,=19
01700 CAIN TAC2,1
01800 MOVE TAC3,TAC2
01900 MOVE TAC2,GB1(TAC)
02000 TRNN TAC2,BLKOCC
02100 SKIPA SEARCH,[WCON+HWCON]
02200 SKIPA SEARCH,[BCON+HBCON]
02300 SKIPA REPLCE,[BLKNGH*NGHBTS]
02400 SKIPA REPLCE,[WHTNGH*NGHBTS]
02500 SKIPA TAC2,[SECCON]
02600 HRLZI TAC2,SECCON
02700 SKIPE TTYGUY
02800 MOVS TAC2,TAC2
02900 MOVEM TAC2,NXTENM ;"NEAR ENEMY GROUP" MARK
03000 MOVEI TAC2,377
03100 EXPSPA: TDNE TAC2,GBOARD(TAC)
03200 JRST EXPSP1-1
03300 MOVE TAC1,GB3(TAC) ;CHECK FOR NEXT-TO-GROUP POINT
03400 TDNN TAC1,[XWD SECCON,SECCON]
03500 JRST .+4 ;NOT NEXT-TO-GROUP
03600 TDNN TAC1,NXTENM
03700 JRST EXPSP1-1 ;ONLY NEXT-TO-FRIENDLY-GROUP
03800 POPJ PDP, ;NEXT TO ENEMY GROUP
03900 CAIG TAC3,=18
04000 CAIG TAC3,1
04100 POPJ PDP,
04200 SOJLE CLEAR,.-1 ;FOUND ANOTHER POINT, DECREMENT "CLEAR"
04300 MOVEI TAC1,3
04400 EXPSP1: TDNN TAC5,@GBDTST(TAC1)
04500 TDNE TAC4,@GB1TST(TAC1)
04600 JRST EXPSP2
04700 ORM TAC5,@GBDTST(TAC1)
04800 TDNE SEARCH,@GBDTST(TAC1)
04900 JRST EXPSP3 ;FRIENDLY GROUP POINT
05000 TDNE REPLCE,@GBDTST(TAC1)
05100 JRST EXPSP2 ;NEXT TO ENEMY STONE
05200 HRRZ TAC3,INCCNT+1(TAC1)
05300 MOVE TAC3,0(TAC3) ;GET CONSTANT INDEX
05400 CAILE TAC3,1
05500 CAILE TAC3,=18
05600 JRST EXPSP2 ;DONT CRAWL ON LINE 1
05700 EXPSP3: XCT INCCNT(TAC1)
05800 MOVEI TAC,@GODOWN(TAC1)
05900 HRLM TAC1,0(PDP)
06000 PUSHJ PDP,EXPSPA
06100 HLRZ TAC1,0(PDP)
06200 MOVEI TAC,@GODOWN+2(TAC1)
06300 XCT INCCNT+2(TAC1)
06400 JUMPLE CLEAR,EXPSP2+1
06500 EXPSP2: SOJGE TAC1,EXPSP1
06600 POPJ PDP,
06700
06800 INCCNT: SOS TAC3,ICOUNT
06900 SOS TAC3,JCOUNT
07000 AOS TAC3,ICOUNT
07100 AOS TAC3,JCOUNT
07200 SOS TAC3,ICOUNT
07300 SOS TAC3,JCOUNT
07400 ICOUNT: 0
07500 JCOUNT: 0
07600
07700 ;**********
07800 ; ERASE THE BKOUT BITS SET BY EXPSPC. TAC MUST BE SET ON ENTRANCE.
07900 ;**********
08000 BKERAS: MOVEI TAC2,BKOUT
08100 ANDCAM TAC2,GBOARD(TAC)
08200 MOVEI TAC1,3
08300 BKERA2: TDNN TAC2,@GBDTST(TAC1)
08400 JRST BKERA1
08500 MOVEI TAC,@GODOWN(TAC1)
08600 HRLM TAC1,0(PDP)
08700 PUSHJ PDP,BKERAS+1
08800 HLRZ TAC1,0(PDP)
08900 MOVEI TAC,@GODOWN+2(TAC1)
09000 BKERA1: SOJGE TAC1,BKERA2
09100 POPJ PDP,
09200
09300 ;**********
09400 ; COUNT THE BLANKS NEXT TO A POINT. THIS IS USED TO SEE IF TWO
09500 ;ADJACENT EYE-MAKING MOVES ARE A SURE EYE OR TWO SURE EYES (OR NO
09600 ;SURE EYES). IF THE TOTAL BLANKS IS ≥4 AND THERE ARE NO NON-DEAD
09700 ;OPPOSING STONES AROUND, THEN WE HAVE TWO EYES.
09800 ;**********
09900 0 ;HOLDS COUNT OF BLANKS
10000 BNKCNT: MOVEI TAC1,3
10100 MOVE TAC4,@GB1TST(TAC1)
10200 TRNE TAC4,BNKOCC
10300 JRST BNKCN1-1 ;ADJACENT BLANK
10400 TDNN TAC4,ENEMY
10500 JRST BNKCN1
10600 ANDI TAC4,177
10700 MOVE TAC4,STRPTR(TAC4)
10800 TLNE TAC4,DEDBIT
10900 JRST BNKCN1-1 ;ADJACENT DEAD ENEMY
11000 SETOM BNKCNT-1 ;ADJACENT ALIVE ENEMY
11100 POPJ PDP,
11200 AOS BNKCNT-1
11300 BNKCN1: SOJGE TAC1,BNKCNT+1
11400 POPJ PDP,
11500
11600 ;**********
11700 ; ENDANG DOES THE FINAL CALCULATIONS AND POLISHING UP OF THE GLOBAL
11800 ;EVALUATOR. THE IDEA IS TO IMPROVE ON THE NOMOVE DATA BY ADDING IN SOME
11900 ;PROPERTIES THAT DEPEND ON MORE THAN ONE POINT.
12000 ;**********
12100 ↑↑ENDANG:MOVEM 16,R16SAV
12200 MOVEM PDP,PDPSAV
12300 MOVE 16,MSCVAL
12400 MOVE PDP,PNTDPY ;NEED BIG PDL FOR EXPSPA
12500 ADD PDP,[IOWD =450,=10]
12600
12700 ;**********
12800 ; POLISHING LOOP #1
12900 ; SEE IF THERE ARE ANY IMPLIED GROUP SPLITTINGS AND ALSO SEE
13000 ;WHICH MOVES ADD TO AREA FOR EITHER OR BOTH SIDES.
13100 ;**********
13200 MOVEI TAC,BRDWTH*BRDWTH-1
13300 MOVEI BLANK,NONOCC
13400 POLOP1: TDNE BLANK,GB1(TAC) ;IS POINT OFF EDGE
13500 JRST POLP11
13600 ;*****TRY FOR IMPLIED GROUP SPLITTING
13700 MOVE TAC2,GB3(TAC)
13800 CAMN TAC2,[-1]
13900 JRST POLP11 ;ILLEGAL MOVE FOR FRIENDLY
14000 TDNE TAC2,[150000150]
14100 JRST ARACLC-2 ;THIS POINT HAS CAPTURE OR TWOLIB
14200 TRNE TAC2,CMFRDG
14300 TLNN TAC2,CMFRDG
14400 JRST .+3
14500 TDO TAC2,[XWD SPLENG,SPLENG]
14600 JRST ARACLC-3
14700 TDNE TAC2,[XWD ENMGRP,ENMGRP]
14800 JRST ARACLC-2 ;SOLID CONNECTIONS, SPLITS HANDLED ELSEWHERE
14900 AND TAC2,[XWD CMFRDG+EXPFGP+SECCON,EXPFGP+SECCON]
15000 CAMN TAC2,[XWD CMFRDG+EXPFGP+SECCON,EXPFGP+SECCON]
15100 TRO TAC2,SPLENG ;SPLITS ENEMY GROUP
15200 ORM TAC2,GB3(TAC)
15300 MOVE TAC2,GB3(TAC)
15400 AND TAC2,[XWD EXPFGP+SECCON,CMFRDG+EXPFGP+SECCON]
15500 CAMN TAC2,[XWD EXPFGP+SECCON,CMFRDG+EXPFGP+SECCON]
15600 TLO TAC2,SPLENG ;SPLITS FRIENDLY GROUP
15700 ORM TAC2,GB3(TAC)
15800 ;**********
15900 ; DEFINE WHICH MOVES CAN MAKE AREA FOR EACH SIDE. NOTE THAT MAKING
16000 ;"AREA" IN THE CENTER MEANS OBSTRUCTING THE ABILITY OF THE OTHER SIDE
16100 ;TO EXPAND ITS GROUPS.
16200 ;**********
16300 MOVEI BWREG,1
16400 MOVEI ENEMY,BLKOCC
16500 ARACLC: XORI ENEMY,WHTOCC+BLKOCC
16600 MOVE CLEAR,GB3(TAC)
16700 CAMN BWREG,TTYGUY
16800 MOVS CLEAR,CLEAR
16900 HLRE TAC1,GBOARD(TAC)
17000 XCT JUMPER+2(BWREG)
17100 TRO CLEAR,ENMGRD ;ON ENEMY-INFLUENCED POINT
17200 LDB TAC1,[POINT 6,GB1(TAC),5]
17300 JUMPE TAC1,NOAREA
17400 MOVE TAC1,AREAPT(TAC1)
17500 XCT JUMPER+2(BWREG)
17600 TROA CLEAR,ENAREA ;ENEMY AREA POINT
17700 TLO CLEAR,ENAREA ;ON OWN AREA POINT
17800 ;**********
17900 ; THIS CHECK FOR TWO ADJACENT EYE-MAKING MOVES IS USED TO
18000 ;PREVENT MAKING A ONE-POINT EYE OUT OF A TWO-POINT EYE. IT HELPS
18100 ;THE GROUP ENDANGERED CALCULATION BY DETECTING SAFE EYE SHAPES.
18200 ;**********
18300 NOAREA: TRNE CLEAR,FRDEYE
18400 TRNE CLEAR,SAVFRS
18500 JRST EYES1+1 ;NOT NON-URGENT EYEMAKING POINT
18600 SETZM BNKCNT-1 ;COUNTS # ADJACENT BLANKS
18700 MOVEI TAC3,3
18800 EYES0: CAME BWREG,TTYGUY
18900 SKIPA TAC2,@GB3TST(TAC3)
19000 MOVS TAC2,@GB3TST(TAC3)
19100 CAMN TAC2,[-1]
19200 JRST EYES1 ;OCCUPIED OR ILLEGAL POINT
19300 TRNE TAC2,FRDEYE
19400 TRNE TAC2,SAVFRS
19500 JRST EYES1
19600 ;*****WE HAVE TWO ADJACENT EYEMAKERS
19700 PUSHJ PDP,BNKCNT
19800 SKIPG BNKCNT-1
19900 JRST EYES1+1 ;EYEMAKER WAS URGENT
20000 MOVEI TAC,@GODOWN(TAC3)
20100 PUSHJ PDP,BNKCNT
20200 CAME BWREG,TTYGUY
20300 SKIPA TAC4,GB2(TAC)
20400 MOVS TAC4,GB2(TAC)
20500 MOVEI TAC,@GODOWN+2(TAC3)
20600 SKIPG TAC1,BNKCNT-1
20700 JRST EYES1+1 ;EYEMAKER WAS URGENT
20800 MOVEI TAC2,EYE
20900 ORM TAC2,GBOARD(TAC) ;MARK EYE POINT
21000 ORM TAC2,@GBDTST(TAC3)
21100 SETOM GB3(TAC) ;DONT PLAY ON EYE
21200 SETOM @GB3TST(TAC3)
21300 HRLZI TAC2,EYEVAL ;GIVE CREDIT FOR ONE EYE
21400 CAIL TAC1,4
21500 LSH TAC2,1 ;GIVE CREDIT FOR TWO EYES
21600 ;*****FIND NAME OF GROUP TO REWARD
21700 ANDI TAC4,77
21800 JUMPN TAC4,EYES2 ;OTHER POINT HAS NAME
21900 CAME BWREG,TTYGUY
22000 SKIPA TAC4,GB2(TAC)
22100 MOVS TAC4,GB2(TAC)
22200 ANDI TAC4,77
22300 JUMPN TAC4,EYES2 ;CURRENT POINT HAS NAME
22400 MOVE TAC1,GB1(TAC)
22500 LSH TAC1,-=30 ;AREA NAME
22600 SKIPN TAC1
22700 JRST EYES1+1 ;CANT FIND GROUP NAME
22800 MOVS TAC4,AREAPT(TAC1)
22900 ANDI TAC4,777 ;AREA BASE POINT ADDRESS
23000 LDB TAC4,[POINT 7,GB1(TAC4),28] ;GROUP NAME
23100 EYES2: ADDM TAC2,GRPPTR+2*MXARNO(TAC4) ;ADD EYE BONUS
23200 JRST POLP11
23300 EYES1: SOJGE TAC3,EYES0
23400 TDNE CLEAR,[XWD NDNGST,NDNGST]
23500 JRST POLP12 ;THIS MOVE ENDANGERS ITSELF
23600 MOVE TAC2,GBOARD(TAC)
23700 TRNE TAC2,DAME ;DAME POINT DOESN'T MAKE AREA
23800 JRST POLP12 ;OR HINDER EXPANSION
23900 MOVE TAC2,TAC
24000 IDIVI TAC2,BRDWTH
24100 MOVEM TAC2,ICOUNT
24200 MOVEM TAC3,JCOUNT
24300 SUBI TAC2,=10
24400 MOVM TAC2,TAC2 ;TAC2>6 MEANS I ON THIRD LINE OR LOWER
24500 SUBI TAC3,=10
24600 MOVM TAC3,TAC3 ;TAC3>6 MEANS J ON THIRD LINE OR LOWER
24700 ;*****TRY FOR FIRST LINE AREA-MAKER
24800 CAIN TAC2,=9 ;ELIMINATE THE FIRST LINE
24900 JRST .+3
25000 CAIE TAC3,=9
25100 JRST NOARE1 ;NOT ON FIRST LINE
25200 TRNE CLEAR,CMFRDG
25300 JRST ARDONE ;CONNECTS FRIENDLY GROUPS
25400 TRNN CLEAR,SECCON
25500 JRST NOAR01
25600 TLNN CLEAR,SECCON ;SECURE EXTENSION FROM ENEMY
25700 TRNE CLEAR,ENAREA+SAVFRS+ATARES
25800 TRO CLEAR,EXPFRA+ENBLOK ;AREA, EXPANSION
25900 JRST ARDONE+1
26000 NOAR01: TRNE CLEAR,EXPFGP
26100 TRNN CLEAR,ENAREA
26200 JRST ARDONE+1
26300 TRNN CLEAR,ENMGRP
26400 TRO CLEAR,EXPFRA+ENBLOK ;SMALL MONKEY-JUMP
26500 JRST ARDONE+1
26600 JUMPER: SKIPGE GBOARD(TAC2)
26700 SKIPLE GBOARD(TAC2)
26800 SKIPLE TAC1
26900 SKIPGE TAC1
27000 ;*****TRY FOR LINE 2 AREA-MAKER
27100 NOARE1: CAIN TAC2,=8
27200 JRST .+3
27300 CAIE TAC3,=8
27400 JRST NOARE2 ;NOT ON SECOND LINE
27500 TRNE CLEAR,CMFRDG
27600 JRST ARDONE ;CONNECTS FRIENDLY GROUPS
27700 TRNN CLEAR,SECCON
27800 JRST NOAR11
27900 TRNN CLEAR,TWOLFS+NDNGST
28000 TDNN CLEAR,[XWD SECCON,ENAREA+ENMGRP+SAVFRS]
28100 JRST ARDONE+1
28200 TLNE CLEAR,SECCON
28300 TRO CLEAR,ENBLOK ;HINDERS ENEMY DEVELOPMENT
28400 JRST ARDONE
28500 NOAR11: TRNE CLEAR,EXPFGP
28600 TRNE CLEAR,ENMGRP+TWOLFS+NDNGST
28700 JRST ARDONE+1
28800 TLNN CLEAR,SECCON
28900 JRST ARDONE+1
29000 TLO CLEAR,EXPFRA+ENBLOK ;ENEMY AREA-MAKER, FRIENDLY EXPANDER
29100 TRO CLEAR,EXPFRA+ENBLOK ;HINDERS ENEMY EXPANSION
29200 JRST ARDONE+1
29300 ;*****LINE 3 AREA-MAKER POINT
29400 NOARE2: SETZM NBLNKS ;FLAG FOR AREA-MAKING AWARDS
29500 CAIE TAC2,7
29600 JRST NOAR21
29700 MOVE TAC4,ICOUNT
29800 MOVEI TAC5,BRDWTH-2(TAC)
29900 CAIG TAC4,=10
30000 SUBI TAC5,3*BRDWTH
30100 MOVEI TAC4,4(TAC5)
30200 TDNN ENEMY,GB1(TAC4) ;MAKE SURE LINES 1,2 ARE NOT ENEMY
30300 TDNE ENEMY,GB1+BRDWTH(TAC4)
30400 JRST ARDONE+1
30500 CAME TAC4,TAC5
30600 SOJA TAC4,.-4
30700 JRST NOAR22
30800 NOAR21: CAIE TAC3,7
30900 JRST NOARE3
31000 MOVE TAC4,JCOUNT
31100 MOVEI TAC5,-2*BRDWTH+1(TAC)
31200 CAIG TAC4,=10
31300 SUBI TAC5,3
31400 MOVEI TAC4,4*BRDWTH(TAC5)
31500 TDNN ENEMY,GB1(TAC4)
31600 TDNE ENEMY,GB1+1(TAC4)
31700 JRST ARDONE+1
31800 SUBI TAC4,BRDWTH
31900 CAML TAC4,TAC5
32000 JRST .-5
32100 NOAR22: JUMPE CLEAR,ARDONE-2 ;MAKES AREA IF NOTHING NEARBY
32200 TRNN CLEAR,CMFRDG
32300 JRST .+4
32400 XCT JUMPER(BWREG)
32500 SKIPE NENEMY
32600 JRST ARDONE
32700 TRNN CLEAR,SECCON
32800 JRST NOAR23
32900 TRNE CLEAR,TWOLFS+NDNGST
33000 JRST ARDONE+1
33100 TLNN CLEAR,SECCON
33200 JRST NOARE3 ;TRY FOR HINDERING EXPANSION
33300 TRO CLEAR,ENBLOK ;HINDERS ENEMY EXPANSION
33400 TLO CLEAR,ENBLOK ;HINDERS FRIENDLY EXPANSION
33500 JRST ARDONE
33600 NOAR23: SETOM NBLNKS
33700 TRNE CLEAR,EXPFGP
33800 TLNN CLEAR,SECCON
33900 JRST NOARE3
34000 TRNN CLEAR,BADHAF
34100 TRNN CLEAR,TWOLFS+NDNGST
34200 TRNE CLEAR,ENMGRP
34300 JRST ARDONE+1
34400 JRST ARDONE-2
34500 ;*****LINE >3 AREA-MAKER POINT
34600 NOARE3: TRNN CLEAR,EXPFGP
34700 JRST ARDONE+1
34800 MOVEI TAC1,3
34900 MOVEI TAC4,BLKOCC+WHTOCC
35000 TDNN TAC4,@GB1TST(TAC1)
35100 TDNE TAC4,@G1DIAG(TAC1)
35200 JRST ARDONE+1
35300 SOJGE TAC1,.-3
35400 TLO CLEAR,ENBLOK ;HINDERS FRIENDLY DEVELOPMENT
35500 SKIPN NBLNKS
35600 JRST ARDONE+1
35700 TRO CLEAR,EXPFRA ;MAKES FRIENDLY AREA ON 3RD LINE
35800 TLOA CLEAR,EXPFRA ;RESTRICTS FRIENDLY DEVELOPMENT
35900 ARDONE: TRO CLEAR,EXPFRA ;MAKES MORE FRIENDLY AREA
36000 TLNN CLEAR,ENMGRP ;IF NEXT TO FRIENDLY
36100 JRST POLP12 ;STONE, THEN MUST BE
36200 TRNN CLEAR,ENMGRP ;NEXT TO ENEMY STONE
36300 TRZ CLEAR,EXPFRA ;ALSO TO MAKE AREA
36400 POLP12: CAMN BWREG,TTYGUY
36500 MOVS CLEAR,CLEAR
36600 MOVEM CLEAR,GB3(TAC)
36700 SOJGE BWREG,ARACLC
36800 POLP11: SOJGE TAC,POLOP1
36900
37000 ;**********
37100 ; A KEY STRING IS ONE WHICH SEPARATES TWO OR MORE ENEMY GROUPS.
37200 ;THIS SECTION OF KILLIV FINDS ALL SUCH KEY STRINGS.
37300 ;**********
37400 MOVEI ENEMY,176
37500 KEYSTN: MOVE TAC1,STRPTR(ENEMY)
37600 TLZE TAC1,KEYBIT ;CLEAR "KEY STRING" BIT
37700 MOVEM TAC1,STRPTR(ENEMY)
37800 TLNE TAC1,DEDBIT
37900 JRST KEYST1 ;DEAD STRING CANT BE KEY
38000 HRRZ TAC2,STRPTR(ENEMY)
38100 CAIL TAC2,12000
38200 JRST KEYST2 ;≥10 STONES MUST BE KEY
38300 CAIG TAC2,1000
38400 JRST KEYST1 ;NO STRING IN THIS SLOT
38500 MOVE SEARCH,ENEMY
38600 PUSHJ PDP,CONNCT
38700 SKIPN WHTARM+1
38800 TDZA TAC1,TAC1
38900 KEYST2: HRLZI TAC1,KEYBIT
39000 ORM TAC1,STRPTR(ENEMY)
39100 KEYST1: SOJGE ENEMY,KEYSTN
39200 ;**********
39300 ; IF ONE-MAN STRING IS KEY AND PART OF A CROSS-CUT IN WHICH
39400 ;THE OTHER PART OF THE CROSS-CUT IS ENDANGERED, THEN ERASE THE KEYNESS
39500 ;OF THE ONE-MAN STRING.
39600 ;**********
39700 MOVEI REPLCE,776000
39800 MOVEI SEARCH,176
39900 HRLZI CLEAR,KEYBIT
40000 HRLZI TAC4,DANBIT
40100 SETZ TAC3,
40200 KEYST3: TDNN REPLCE,STRPTR(SEARCH)
40300 TDNN CLEAR,STRPTR(SEARCH)
40400 JRST KEYST4+1 ;NOT KEY OR TOO BIG
40500 MOVEI FRIEND,BLKOCC+WHTOCC
40600 MOVEI ENEMY,BLKOCC+WHTOCC
40700 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
40800 AND FRIEND,GB1(TAC)
40900 XOR ENEMY,FRIEND
41000 MOVEI TAC1,3
41100 KEYST5: TDNN FRIEND,@G1DIAG(TAC1)
41200 JRST KEYST4 ;NOT FRIENDLY
41300 TDNE ENEMY,@GB1TST(TAC1)
41400 TDNN ENEMY,@GB1TST+3(TAC1)
41500 JRST KEYST4
41600 LDB TAC2,[POINT 7,@G1DIAG(TAC1),35]
41700 TDNE TAC4,STRPTR(TAC2)
41800 TDNN CLEAR,STRPTR(TAC2)
41900 JRST KEYST4 ;NOT KEY ENDANGERED FRIENDLY
42000 MOVEM SEARCH,WHTARM(TAC3)
42100 AOJ TAC3,
42200 KEYST4: SOJGE TAC1,KEYST5
42300 SOJGE SEARCH,KEYST3
42400 SETZM WHTARM(TAC3)
42500 SETZ TAC3,
42600 SKIPN TAC,WHTARM(TAC3)
42700 JRST .+3
42800 ANDCAM CLEAR,STRPTR(TAC)
42900 AOJA TAC3,.-3
43000
43100 ;**********
43200 ; DECIDE WHICH GROUPS ON THE BOARD ARE ENDANGERED BY NEARBY ENEMY STONES
43300 ;THE IDEA IS TO COUNT THE NUMBER OF EYES, AREAS, AREA POINTS, CONNECTION
43400 ;POINTS, EXTENSIONS, LIBERTIES, ETC. TO DISCOVER "HOW BIG" A GROUP IS. IF
43500 ;A GROUP IS FREE TO EXPAND, IT IT A LOT "BIGGER". IF THE GROUP SEEMS TO
43600 ;BE TOO SMALL AND IS SURROUNDED BY MUCH BIGGER GROUPS, THE SMALL GROUP IS
43700 ;THOUGHT TO BE DEAD.
43800 ;**********
43900 SETZM DFLAG
44000 MOVEI BLANK,MXARNO-1
44100 NDANG: HRRZ TAC,GRPPTR+MXARNO(BLANK)
44200 JUMPE TAC,NDANG1
44300 HRRZ FRIEND,GRPPTR(BLANK)
44400 MOVE TAC2,FRIEND
44500 TRZN FRIEND,777000
44600 JRST NDANG4 ;THIS GROUP HAS NO STONES
44700 LSH TAC2,-5 ;TAC2 HAS 16*(# STONES)
44800 LDB TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),17] ;HALFEYES
44900 CAIL TAC3,2*EYEVAL ;≥TWO "EYES" MEANS
45000 ADDI TAC3,=50 ;SAFE GROUP
45100 ADD FRIEND,TAC3
45200 LDB TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),8] ;AREAS
45300 SOJLE TAC3,.+3
45400 LSH TAC3,5 ;320 FOR EACH EXTRA AREA
45500 ADD FRIEND,TAC3
45600 LDB TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),26] ;AREA POINTS
45700 ADD FRIEND,TAC3
45800 LDB TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),35] ;CONNECTIONS
45900 ADD FRIEND,TAC3
46000 IMULI FRIEND,=10
46100 LDB TAC3,[POINT 9,GRPPTR+MXARNO(BLANK),8] ;EXTENSIONS
46200 CAML TAC3,TAC2 ;IF 16*(# STONES)≤(# EXTENSIONS)
46300 ADD FRIEND,=21(16) ;THEN GROUP IS NEVER DEAD
46400 ADD FRIEND,TAC3
46500 CAMLE FRIEND,=19(16)
46600 JRST NDANG4 ;SUPERSAFE GROUP ALREADY
46700 CAML FRIEND,=21(16)
46800 JRST NDANG2
46900 LDB TAC3,[POINT 7,GB1(TAC),35]
47000 MOVE TAC3,STRPTR(TAC3)
47100 TLNN TAC3,KEYBIT
47200 JRST NDANG3 ;NOT KEY AND "TOO SMALL"
47300 NDANG2: MOVEI CLEAR,=10
47400 PUSHJ PDP,EXPSPC
47500 JUMPG CLEAR,.+2
47600 ADD FRIEND,=20(16) ;GROUP NOT ENCLOSED
47700 HRRZ TAC,GRPPTR+MXARNO(BLANK)
47800 PUSHJ PDP,BKERAS
47900 LDB TAC1,[POINT 9,GRPPTR(BLANK),26]
48000 IMULI TAC1,=10
48100 SUBM FRIEND,TAC1
48200 CAMLE TAC1,=22(16) ;MAX ENDANGERED SCORE
48300 JRST NDANG4
48400 CAMLE FRIEND,=22(16) ;SCORE-10*(# STONES)<=22(16)
48500 MOVE FRIEND,=22(16) ;IS "HEAVY" AND ENDANGERED
48600 NDANG3: CAIE SEARCH,WCON+HWCON
48700 SKIPA TAC1,BLDATA
48800 MOVE TAC1,WHDATA
48900 AOS =34(TAC1)
49000 LDB TAC2,[POINT 9,GRPPTR(BLANK),27]
49100 ADDM TAC2,=32(TAC1)
49200 NDANG4: HRLM FRIEND,GRPPTR+MXARNO(BLANK)
49300 CAMGE FRIEND,=21(16)
49400 JRST .+4
49500 CAMG FRIEND,=22(16)
49600 SETOM DFLAG
49700 JRST NDANG1
49800 SKIPGE DFLAG
49900 JRST NDANG1
50000 CAMLE FRIEND,DFLAG
50100 MOVEM FRIEND,DFLAG ;BEST "HOPELESS" SCORE
50200 NDANG1: SOJGE BLANK,NDANG
50300 SKIPG DFLAG
50400 JRST NDANG6+1
50500 MOVE TAC1,=21(16)
50600 SUB TAC1,DFLAG
50700 HRLZI TAC1,5(TAC1) ;MAKE "HOPELESS" ENDANGERED
50800 MOVEI BLANK,MXARNO-1
50900 NDANG5: HRRZ TAC,GRPPTR+MXARNO(BLANK)
51000 JUMPE TAC,NDANG6
51100 HRRZ FRIEND,GRPPTR(BLANK)
51200 TRZE FRIEND,777000
51300 ADDM TAC1,GRPPTR+MXARNO(BLANK) ;SCALING UP SCORES
51400 NDANG6: SOJGE BLANK,NDANG5
51500
51600 ;**********
51700 ; POLISHING LOOP #2.
51800 ; PUT DOWN THE "NEAR ENDANGERED GROUP" MARKS FOR BOTH SIDES. IF
51900 ;THE GROUP IS SUPERSAFE, THEN REMOVE "MAKES TIGERMOUTH" AND "MAKES EYE"
52000 ;CREDIT, AS THESE PROPERTIES ARE USELESS.
52100 ;**********
52200 MOVEI TAC,BRDWTH*BRDWTH-1
52300 DANLOP: HLRZ TAC1,GB2(TAC) ;ENEMY GROUP NAMES
52400 SETZ TAC5, ;TESTS FOR "BOTH SIDES DEAD"
52500 SETZM NFRND ;LARGEST FRIENDLY GROUP SCORE
52600 SETZM NENEMY ;LARGEST ENEMY GROUP SCORE
52700 CAIN TAC1,777777
52800 JRST DANLP2-2 ;MORE THAN THREE GROUPS CONNECTED
52900 DANE1: MOVEI TAC2,77
53000 AND TAC2,TAC1 ;PICK OFF A NAME
53100 JUMPE TAC2,DANLP2 ;NO MORE NAMES
53200 LSH TAC1,-6 ;SET UP FOR NEXT NAME
53300 HLRZ TAC3,GRPPTR+MXARNO(TAC2)
53400 CAMLE TAC3,NENEMY
53500 MOVEM TAC3,NENEMY ;GET LARGEST GROUP SCORE
53600 CAMLE TAC3,=22(16)
53700 JRST DANE1
53800 CAMG TAC3,=21(16)
53900 SOJA TAC5,DANE1 ;COUNT DEAD ENEMIES
54000 HRLZI TAC4,GPNDNG ;NEAR ENEMY ENDANGERED GROUP
54100 ORM TAC4,GB3(TAC)
54200 DANLP2: HRRZ TAC1,GB2(TAC)
54300 CAIN TAC1,777777
54400 JRST DANLP1-2
54500 DANF1: MOVEI TAC2,77
54600 AND TAC2,TAC1
54700 JUMPE TAC2,DANLP1
54800 LSH TAC1,-6
54900 HLRZ TAC3,GRPPTR+MXARNO(TAC2)
55000 CAMLE TAC3,NFRND
55100 MOVEM TAC3,NFRND ;GET LARGEST FRIENDLY GROUP SCORE
55200 CAMLE TAC3,=22(16)
55300 JRST DANF1
55400 CAMLE TAC3,=21(16)
55500 JRST DANLP1-2
55600 JUMPE TAC5,DANF1
55700 ;**********
55800 ; IF POINT IS NEAR BOTH "DEAD" FRIENDLY AND "DEAD"
55900 ;ENEMY GROUPS, THEN MARK IT ENDANGERED FOR BOTH SIDES. THIS
56000 ;APPROXIMATION AIDS THE SAFETY CALCULATION IN COMPLEX
56100 ;TACTICAL SITUATIONS.
56200 ;**********
56300 HRLZI TAC4,GPNDNG
56400 ORM TAC4,GB3(TAC)
56500 MOVEI TAC4,GPNDNG ;NEAR FRIENDLY ENDANGERED GROUP
56600 ORM TAC4,GB3(TAC)
56700 DANLP1: MOVE TAC4,GB3(TAC)
56800 CAMN TAC4,[-1]
56900 JRST DANLP3
57000 TDNE TAC4,[XWD NDNGST,NDNGST]
57100 JRST DANLP4
57200 TLNN TAC4,3000 ;MAKES ENEMY EYE OR TIGERMOUTH
57300 JRST DANLP5
57400 TLZ TAC4,TWOLFS ;SELF-TWO-LIBBER IS IRRELEVANT
57500 TRNN TAC4,EXPFGP
57600 JRST DANLP5
57700 TDNN TAC4,[XWD ENAREA,ENAREA]
57800 TLO TAC4,EXPFRA ;MAKES ENEMY AREA
57900 DANLP5: TRNN TAC4,3000
58000 JRST DANLP4
58100 TRZ TAC4,TWOLFS
58200 TLNN TAC4,EXPFGP
58300 JRST DANLP4
58400 TDNN TAC4,[XWD ENAREA,ENAREA]
58500 TRO TAC4,EXPFRA
58600 DANLP4: MOVE TAC3,NENEMY
58700 CAMLE TAC3,=19(16)
58800 TLZ TAC4,3000 ;SUPERSAFE GROUP DOESNT NEED MORE EYES
58900 MOVE TAC3,NFRND
59000 CAMLE TAC3,=19(16)
59100 TRZ TAC4,3000
59200 MOVEM TAC4,GB3(TAC)
59300 DANLP3: SOJGE TAC,DANLOP
59400
59500 ;**********
59600 ; POLISHING LOOP #3
59700 ; GIVE THE TIGERMOUTH MOVES THE VALUES OF THE DIRECT CONNECTION THEY
59800 ;ARE REPLACING. THIS MEANS CONNECTION, SPLITTING, AREA-MAKING, AND "NEAR
59900 ;ENDANGERED GROUP" IF ANY OF THESE BITS ARE ON.
60000 ;**********
60100 MOVEI BLANK,BNKOCC
60200 MOVE FRIEND,[XWD NDNGST,NDNGST]
60300 MOVE TAC1,BRDDPY
60400 TIGEXP: SKIPN TAC,0(TAC1)
60500 JRST TIGEX1+2
60600 MOVEI TAC3,CMFRDG
60700 TLZN TAC,777777
60800 TLOA TAC3,SPLENG ;FRIENDLY SPREAD CONNECTION
60900 MOVS TAC3,TAC3 ;ENEMY SPREAD CONNECTION
61000 MOVE TAC4,[XWD GPNDNG+EXPFRA+EXPFGP,GPNDNG+EXPFRA+EXPFGP]
61100 AND TAC4,GB3(TAC)
61200 OR TAC3,TAC4 ;SPREAD THESE BITS TO TIGERMOUTH ALSO
61300 MOVEI TAC2,3
61400 TDNN BLANK,@GB1TST(TAC2)
61500 JRST TIGEX1
61600 TDNN FRIEND,@GB3TST(TAC2)
61700 ORM TAC3,@GB3TST(TAC2)
61800 TIGEX1: SOJGE TAC2,.-4
61900 AOJA TAC1,TIGEXP
62000
62100 MOVE PDP,PDPSAV
62200 MOVE 16,R16SAV
62300 POPJ PDP,
62400
62500 BEND
00100 BEGIN AREABL
00200
00300 ;**********
00400 ; ARLOOP STARTS AT SELECTED NOT-AREA POINTS AND SEARCHES ALL
00500 ;DIRECTIONS FOR NEIGHBORING NOT-AREA POINTS. IT IS STOPPED BY ANY
00600 ;BOUNDARY POINT TO A (POSSIBLE) FRIENDLY AREA. THE TESTING REGISTERS
00700 ;SHOULD BE SET AS FOLLOWS:
00800 ; 1. BLANK TO "NOT OCCUPIED" BIT IN GB1
00900 ; 2. FRIEND TO FRIENDLY OCCUPIED BIT IN GB1
01000 ; 3. ENEMY TO BLANK BOUNDARY POINT BIT IN GBOARD
01100 ; 4. REPLCE TO OFF-THE-EDGE BIT IN GB1
01200 ; 5. SEARCH TO STRONGLY RELATED FRIENDLY BIT IN GB3
01300 ; 6. CLEAR TO STRONGLY RELATED ENEMY BIT IN GB3
01400 ; 7. BWREG TO BAD AREA POINT BIT IN GBOARD
01500 ; 8. TAC TO CURRENT OFFSET ADDRESS
01600 ;**********
01700 ARLOOP: TDNE REPLCE,GB1(TAC)
01800 POPJ PDP, ;BEEN HERE ALREADY
01900 ORM REPLCE,GB1(TAC) ;"BEEN HERE" MARK
02000 TDNE BLANK,GB1(TAC)
02100 JRST ARLOP2
02200 ;*****THIS BOARD POINT IS OCCUPIED
02300 LDB TAC2,[POINT 7,GB1(TAC),35]
02400 MOVE TAC2,STRPTR(TAC2)
02500 TDNN FRIEND,GB1(TAC)
02600 JRST ARLOP1
02700 TLNN TAC2,DEDBIT
02800 JRST ARLOP4 ;ALIVE FRIENDLY STONE
02900 JRST ARLOP3 ;DEAD FRIENDLY STONE
03000 ARLOP1: TLNN TAC2,DEDBIT
03100 JRST ARLOP3 ;ALIVE ENEMY STONE
03200 JRST ARLOP4 ;DEAD ENEMY STONE
03300 ARLOP2: TDNN CLEAR,GB3(TAC)
03400 TDNN SEARCH,GB3(TAC)
03500 JRST ARLOP3 ;STRONGLY RELATED TO ENEMY
03600 ARLOP4: ORM ENEMY,GBOARD(TAC)
03700 POPJ PDP, ;BOUNDARY POINT
03800 ;*****LOOK AT THE FOUR NEIGHBOR POINTS
03900 ARLOP3: MOVEI TAC1,3
04000 ORM BWREG,GBOARD(TAC) ;BAD AREA POINT
04100 MOVEI TAC,@GODOWN(TAC1) ;GO TO NEIGHBOR POINT
04200 HRLM TAC1,0(PDP) ;SAVE DIRECTION COUNT
04300 PUSHJ PDP,ARLOOP
04400 HLRZ TAC1,0(PDP)
04500 MOVEI TAC,@GODOWN+2(TAC1)
04600 SOJGE TAC1,ARLOP3+2
04700 POPJ PDP,
04800
04900 ;**********
05000 ; COUNT UP THE EXTENT OF THE AREA WE ARE IN NOW. SINCE
05100 ;ARLOOP HAS FOUND ALL BAD POINTS, THERE IS NO NEED TO WORRY ABOUT
05200 ;BOUNDING PROBLEMS.
05300 ;**********
05400 COUNTA: TDNN BWREG,GBOARD(TAC) ;BAD AREA POINT?
05500 TDNN TAC5,GB1(TAC) ;OFF EDGE?
05600 POPJ PDP,
05700 TDNN REPLCE,GB1(TAC)
05800 JRST COUNT0 ;NEW POINT
05900 TDNN BLANK,GB1(TAC) ;BLANK BOUNDARY?
06000 TDNN ENEMY,GBOARD(TAC) ;BOUNDARY?
06100 POPJ PDP,
06200 ANDCAM ENEMY,GBOARD(TAC) ;OCCUPIED BOARD POINTS
06300 JRST COUNT3 ;ARE NOT BOUNDARIES
06400 ;FOR NAMEAR
06500 COUNT0: ORM REPLCE,GB1(TAC) ;MARK "BEEN HERE"
06600 TDNE BLANK,GB1(TAC)
06700 JRST COUNT1
06800 COUNT3: TDNE FRIEND,GB1(TAC)
06900 JRST COUNT2
07000 AOS ARAPNT ;DEAD ENEMY STONE COUNTS AS
07100 AOS ARAPNT ;TWO SECURE AREA POINTS
07200 AOS ARASEC
07300 AOS ARASEC
07400 JRST COUNT2
07500 COUNT1: TDNE ENEMY,GBOARD(TAC)
07600 JRST COUNT2 ;DONT COUNT BOUNDARY POINT
07700 AOS ARAPNT ;ANOTHER AREA POINT
07800 TDNE SEARCH,GB3(TAC)
07900 AOS ARASEC ;ANOTHER SECURE AREA POINT
08000 COUNT2: MOVEI TAC1,3
08100 HRLM TAC1,0(PDP)
08200 MOVEI TAC,@GODOWN(TAC1)
08300 PUSHJ PDP,COUNTA
08400 HLRZ TAC1,0(PDP)
08500 MOVEI TAC,@GODOWN+2(TAC1)
08600 SOJGE TAC1,COUNT2+1
08700 POPJ PDP,
08800
08900 ;**********
09000 ; NAME THE AREA JUST FOUND BY INSERTING POINTERS INTO GB1.
09100 ;WE NAME EVERY POINT ON THE BOARD WHICH IS NOT BAD AREA AND IS
09200 ;CONNECTED TO THE STARTING LOCATION AND IS NOT A BOOUNDARY POINT.
09300 ;WE EXPECT:
09400 ; 1. BLANK TO BE 770000000000
09500 ; 2. REPLCE TO BE NAME OF AREA (LSH =30)
09600 ; 3. BWREG TO BE BAD AREA POINT BIT
09700 ; 4. TAC TO BE CURRENT OFFSET ADDRESS
09800 ; 5. TAC5 TO BE BLKOCC+WHTOCC+BNKOCC
09900 ;**********
10000 NAMEAR: TDNN BWREG,GBOARD(TAC) ;BAD AREA POINT?
10100 TDNE BLANK,GB1(TAC) ;BEEN HERE ALREADY?
10200 POPJ PDP,
10300 TDNE TAC5,GB1(TAC) ;OFF-EDGE POINT?
10400 TDNE ENEMY,GBOARD(TAC) ;BOUNDARY POINT?
10500 POPJ PDP,
10600 ANDCAM BLANK,GB1(TAC)
10700 ORM REPLCE,GB1(TAC)
10800 ;*****SAVE NAMES OF ALL GROUPS IN THIS AREA
10900 TDNN FRIEND,GB1(TAC)
11000 JRST NAMEA0-1
11100 LDB TAC1,[POINT 7,GB1(TAC),28] ;GROUP NAME
11200 MOVEI TAC2,WHTARM
11300 SKIPN TAC3,0(TAC2)
11400 JRST .+4
11500 CAMN TAC3,TAC1
11600 JRST NAMEA0-1
11700 AOJA TAC2,.-4
11800 MOVEM TAC1,0(TAC2) ;FOUND ANOTHER GROUP
11900 SETZM 1(TAC2)
12000 ;*****LOOK AT THE FOUR NEIGHBOR POINTS
12100 MOVEI TAC1,3
12200 NAMEA0: HRLM TAC1,0(PDP)
12300 MOVEI TAC,@GODOWN(TAC1)
12400 PUSHJ PDP,NAMEAR
12500 HLRZ TAC1,0(PDP)
12600 MOVEI TAC,@GODOWN+2(TAC1)
12700 SOJGE TAC1,NAMEA0
12800 POPJ PDP,
12900
13000 ;**********
13100 ; THIS IS THE SETUP ROUTINE FOR THE AREA-DEFINITION
13200 ;RECURSION. NOTE REGISTER TAC MUST BE PRE-SET TO A STARTING
13300 ;POINT. THIS SETUP CAN ONLY BE STARTED INSIDE (POSSIBLE)
13400 ;FRIENDLY AREAS.
13500 ;**********
13600 ARAPNT: 0 ;NUMBER OF AREA POINTS
13700 ARASEC: 0 ;NUMBER OF SECURE AREA POINTS
13800 AREA1: SETZM ARAPNT
13900 SETZM ARASEC
14000 PUSHJ PDP,COUNTA
14100 SKIPG TAC1,ARAPNT
14200 POPJ PDP, ;NO AREA POINTS
14300 LSH TAC1,2
14400 MOVE TAC2,ARASEC
14500 IMULI TAC2,7
14600 CAMGE TAC2,TAC1 ;4*ARAPNT≤7*ARASEC?
14700 POPJ PDP, ;AREA IS TOO INSECURE
14800 SETZ TAC2, ;WILL HOLD AREA DATA
14900 TRNN FRIEND,BLKOCC
15000 SKIPA TAC4,WHDATA
15100 SKIPA TAC4,BLDATA
15200 TRO TAC2,400000 ;MARK WHITE AREA
15300 OR TAC2,TACSAV
15400 LSH TAC2,=9
15500 MOVE TAC1,ARAPNT
15600 OR TAC2,TAC1
15700 LSH TAC2,=9
15800 ADDM TAC1,=30(TAC4) ;GLOBAL AREA COUNT
15900 MOVE TAC1,ARASEC
16000 ADDM TAC1,=31(TAC4) ;GLOBAL SECURE AREA COUNT
16100 OR TAC2,TAC1
16200 SKIPN REPLCE,AREAPT
16300 SAILERR <8> ;****NO MORE SLOTS FOR AREA -- ERROR MESSAGE 8 ****
16400 EXCH TAC2,AREAPT(REPLCE)
16500 MOVEM TAC2,AREAPT
16600 SKIPE KWAREA-1
16700 JRST AREA99 ;DONT CHANGE GB1 DATA
16800 ;*****PUT THE NAME OF THIS AREA INTO ITS BOARD POINTS
16900 HRLZI BLANK,770000
17000 LSH REPLCE,=30
17100 MOVE TAC,TACSAV
17200 SETZM WHTARM ;WILL HOLD GROUP NAMES
17300 PUSHJ PDP,NAMEAR
17400 MOVE TAC3,ARAPNT
17500 LSH TAC3,=9
17600 TLO TAC3,1000 ;TAC3 IS # AREAS, # AREA POINTS
17700 ;FOR ADDITION TO GROUP DESCRIPTOR
17800 MOVEI TAC1,WHTARM
17900 SKIPN TAC2,0(TAC1)
18000 JRST .+3
18100 ADDM TAC3,GRPPTR+2*MXARNO(TAC2)
18200 AOJA TAC1,.-3
18300 MOVEI BLANK,BNKOCC
18400 AREA99: MOVEI REPLCE,NONOCC
18500 POPJ PDP,
18600
18700 ;**********
18800 ; AREA CAN ONLY BE CALCULATED AFTER THE STRONGLY RELATED
18900 ;POINTS HAVE BEEN DETERMINED DURING DEVELOPMENT ANALYSIS. IT IS
19000 ;ALSO NECESSARY FOR THE TACTICAL STATES OF ALL STRINGS TO BE KNOWN.
19100 ;AREA IS COMPUTED FOR BOTH PLAYERS BY AN ALGORITHM REPRESENTING
19200 ;A GENERALIZATION OF AREA-COUNTING AT THE END OF THE GAME.
19300 ;**********
19400
19500 ;*****ARRAY STORAGE FOR THE AREA INDICATORS
19600 ↑↑XAREAP:AREAPT ;POINTER FOR SAIL
19700 0
19800 MXARNO-1
19900 1
20000 XWD 1,MXARNO
20100 ↑↑AREAPT:BLOCK MXARNO
20200
20300 0 ;SWITCH FOR STORING RESULTS IN GB1
20400 ↑↑KWAREA:SETOM KWAREA-1 ;DONT CHANGE GB1 (DONT SAVE AREA NAMES)
20500 JRST AREA+1
20600 ↑↑AREA: SETZM KWAREA-1 ;CHANGE GB1 ALSO
20700 MOVEM PDP,PDPSAV
20800 MOVE PDP,PNTDPY
20900 ADD PDP,[IOWD =400,=98]
21000 MOVE TAC,WHDATA
21100 SETZM =30(TAC) ;# WHITE AREA POINTS
21200 SETZM =31(TAC) ;# WHITE SECURE AREA POINTS
21300 MOVE TAC,BLDATA
21400 SETZM =30(TAC) ;# BLACK AREA POINTS
21500 SETZM =31(TAC) ;# BLACK SECURE AREA POINTS
21600 MOVEI ENEMY,MXARNO-1
21700 SETZM AREAPT+MXARNO-1
21800 MOVEM ENEMY,AREAPT-1(ENEMY)
21900 SOJG ENEMY,.-1
22000 SKIPE KWAREA-1
22100 JRST AREA02 ;DO NOT TOUCH GB1
22200 MOVEI TAC,BRDWTH*BRDWTH
22300 HRLZI TAC1,770000
22400 ANDCAM TAC1,GB1(TAC)
22500 SOJGE TAC,.-1
22600 AREA02: MOVEI ENEMY,BKOUT ;BOUNDARY MARK IN GBOARD
22700 MOVEI BWREG,TACBIT ;MARKS BAD AREA POINTS
22800 MOVEI TAC5,WHTOCC+BLKOCC+BNKOCC
22900 MOVEI FRIEND,BLKOCC ;SET UP FOR BLACK AREA ANALYSIS
23000 MOVEI SEARCH,20
23100 SKIPE TTYGUY
23200 HRLZ SEARCH,SEARCH ;PDP-10 IS NOT PLAYING BLACK NOW
23300 MOVS CLEAR,SEARCH ;STRONGLY RELATED TO ENEMY (WHITE)
23400 AREA04: MOVEI TAC,BRDWTH*(BRDWTH-1)
23500 MOVEM TAC,TACSAV
23600 MOVEI REPLCE,NONOCC
23700 MOVEI BLANK,BNKOCC
23800 MOVE TAC4,FRIEND
23900 XORI TAC4,BLKOCC+WHTOCC
24000 ;*****FIRST FIND NOT-AREA POINTS
24100 AREA05: TDNN TAC4,GB1(TAC)
24200 JRST AREA06
24300 LDB TAC2,[POINT 7,GB1(TAC),35]
24400 MOVE TAC2,STRPTR(TAC2)
24500 TLNN TAC2,DEDBIT
24600 PUSHJ PDP,ARLOOP ;START ONLY ON LIVE ENEMY STONES
24700 AREA06: SOS TAC,TACSAV
24800 CAILE TAC,BRDWTH
24900 JRST AREA05
25000 MOVEI TAC,BRDWTH*(BRDWTH-1)
25100 MOVEM TAC,TACSAV
25200 ;*****THEN COUNT AREAS
25300 AREA07: TDNN FRIEND,GB1(TAC)
25400 JRST AREA08
25500 LDB TAC2,[POINT 7,GB1(TAC),35]
25600 MOVE TAC2,STRPTR(TAC2)
25700 TLNN TAC2,DEDBIT
25800 PUSHJ PDP,AREA1 ;START ONLY ON LIVE FRIENDLY STONES
25900 AREA08: SOS TAC,TACSAV
26000 CAILE TAC,BRDWTH
26100 JRST AREA07
26200 ;*****ERASE AREA CALCULATION FLAGS FROM INTERNAL BOARDS
26300 MOVEI REPLCE,NONOCC
26400 MOVEI BLANK,TACBIT+BKOUT
26500 AREA01: MOVE TAC2,TAC
26600 MOVEI TAC1,BRDWTH-2
26700 ADDI TAC2,1
26800 ANDCAM REPLCE,GB1(TAC2) ;GET RID OF "BEEN THERE" BITS
26900 ANDCAM BLANK,GBOARD(TAC2) ;GET RID OF BOUNDARY MARKS
27000 SOJG TAC1,.-3
27100 ADDI TAC,BRDWTH
27200 CAIE TAC,BRDWTH*(BRDWTH-1)
27300 JRST AREA01
27400 ;*****SEE IF WE HAVE DONE BOTH SIDES
27500 TRNN FRIEND,BLKOCC
27600 JRST AREA03
27700 MOVEI FRIEND,WHTOCC
27800 EXCH CLEAR,SEARCH
27900 JRST AREA04 ;ANALYZE WHITE AREAS
28000 AREA03: MOVE PDP,PDPSAV
28100 POPJ PDP,
28200
28300 BEND
28400
28500 END